Просмотр полной версии : Тема для всяких глупых вопросов
Spectramine
30.01.2022, 19:56
Стабильность вполне возможно и есть, но эти флаги работают несколько по другому. Не так, как до сих пор думали. У Патрика есть уже на этот счет гипотеза
Если бы стабильность была, в тесте с картинкой тоже была бы стабильность, там же одни и те же команды выполняются. А раз точки мигают (причем нерегулярно), значит стабильности нет.
- - - Добавлено - - -
Реверс Z80 еще никто не сделал?
Я не в курсе.
А раз точки мигают (причем нерегулярно), значит стабильности нет.
Да вы не на экран смотрите, а сверяйте кусок памяти. Там, может, вообще ничего в реальности не меняется, а телевизор кажет баги пикселей, попавших под "горячую руку" мусорной шины данных процессора. Точнее, тракта видеовыборки.
- - - Добавлено - - -
Полистал тему, увидел скрины с тестами. В них, надеюсь, реально проверяются значения из памяти, так что глюки экрана отпадают =)
а что там за тест на команды LDIR -> NOP' и INIR -> NOP' ?
SoftLight
30.01.2022, 23:02
Ken Shirriff в 2013 ещё делал но что-то я вижу только обрывочные заметки http://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html
А ну и есть серия статей по реверсу от Goran Devic https://baltazarstudios.com/z80-ground/
Все схемы лежат тут плюс реализация под fpga:
https://github.com/gdevic/A-Z80/tree/master/docs/pdf
Все схемы лежат тут плюс реализация под fpga:
https://github.com/gdevic/A-Z80/tree/master/docs/pdf
Не понятно, это схемы реверса или же просто имитация сходной структуры для реализации на FPGA.
polikarpov76
31.01.2022, 00:33
Не понятно, это схемы реверса или же просто имитация сходной структуры для реализации на FPGA.
ну чето он такое из силикона зареверсил и даже прогу написал так что я думаю не имитация а вполне себе:
https://www.youtube.com/watch?v=_dyngzTEnvw
Lethargeek
31.01.2022, 00:55
а что там за тест на команды LDIR -> NOP' и INIR -> NOP' ?
самозатирание, полагаю
ну чето он такое из силикона зареверсил и даже прогу написал так что я думаю не имитация а вполне себе:
Может частично зареверсил, а остальное додумал?
Просто в доках на версию Z80 под FPGA у него нигде явно не сказано, что схема соответствует реверсу.
It differs from the existing Z80 implementations in that it is designed from the ground-up through the schematics and low-level gates.
This design is capable of mimicking the actual Z80 CPU and, through its architecture, it illustrates its inner workings.
The A-Z80 implementation strives to be internally structurally identical to the original Z80. Using this approach, the model achieves a full cycle accuracy and has identical behavior for all documented and undocumented features (*). This is achieved not by explicitly hard-coding exceptions and quirks, but by mimicking the actual design.
самозатирание, полагаю
а где то описывалось правильное поведение при таком? а то смотрю таже FUSE выдает ошибку на тесте
Spectramine
31.01.2022, 16:56
а где то описывалось правильное поведение при таком? а то смотрю таже FUSE выдает ошибку на тесте
https://spectrumcomputing.co.uk/forums/viewtopic.php?f=23&t=6102
Да вы не на экран смотрите, а сверяйте кусок памяти.
https://s.micp.ru/lZ07V.png
Увы. Реальней не бывает. Это кусок памяти (экранной, есичто)
Так что это точно не видимоформирователь.
а должно быть ровно, как тут
https://github.com/raxoft/z80test/tree/master/img
https://raw.githubusercontent.com/raxoft/z80test/89d85243f6aab1e813b16fff5511e3394a486051/img/z80ccfscr-st-cmos.png
https://github.com/raxoft/z80test/commit/89d85243f6aab1e813b16fff5511e3394a486051
Lethargeek
01.02.2022, 01:21
zebest, а INIR->NOP' и INDR->NOP' из z80full и z80ccf как оба проходят?
INIR->NOP' и INDR->NOP' из z80full и z80ccf
На реале?? Эти без проблем проходят.
У меня проблемы только с опкодами, которые порты проверяют.
Lethargeek
01.02.2022, 02:03
У меня проблемы только с опкодами, которые порты проверяют.
в смысле "проверяют"?
INIR->NOP' и INDR->NOP' из z80ccf
ну да, эта группа тестов 095-103 у меня вся не проходит, им нужно четко определенные порты читать, на Профи они видимо по-своему реализованы, тут не повезло.
https://s.micp.ru/5QE1z.jpghttps://s.micp.ru/duT01.jpg
группа тестов 095-103 у меня вся не проходит, им нужно четко определенные порты читать, на Профи они видимо по-своему реализованы
там виноват 6ой бит в порту #FE
(набери в бейсике print in 254 и посмотри результаты на фирме и своём реале)
Lethargeek
01.02.2022, 10:36
там виноват 6ой бит в порту #FE
шестой бит это магнитофон, и он походу проверяется перед тестом, лишь бы не менялся в процессе
а тут пятый занулён почему-то, что-нибудь на профи висит на нём?
а тут пятый занулён почему-то
на фирме из порта читается #BF, получается шестой бит = 0
Lethargeek
01.02.2022, 10:44
на фирме из порта читается #BF, получается шестой бит = 0
"IN FE: 9F" - тут пятый тоже
- - - Добавлено - - -
мне вот что странно, эмуль мой сейчас проходит все кроме INIR->NOP'
хотя код там общий с INDR, разница только в знаке инкремента
сделано по алгоритму отсюда: https://spectrumcomputing.co.uk/forums/viewtopic.php?f=23&t=6102
то ли там чего-то напутали, то ли Патрик тут накосячил
нужен результат с реала с единицей в пятом бите FE
на фирме из порта читается #BF, получается шестой бит = 0
тут вопрос, с чего начинать нумеровать, с нулевого бита, или он первый.
Да, косяк с портами какой то есть
https://s.micp.ru/Zf45n.jpg
Ноль наглухо залипший на порту #DFFE в шестом бите (или все же в пятом?)) , но линия физически при этом шестая :)
Попробую вечером отпаять 6-ю линию от клавы, оставлю 5ть стандартных, посмотрим с какой стороны останется.
Попробую вечером отпаять 6-ю линию от клавы, оставлю 5ть стандартных
Так с клавы же пять линий идет на плату, что там на шестую подвешено? Биты 0-4 - входные данные с полурядов, они в порядке.
Ну это же Профи-к. У него расширенная клавиатура и есть 6 линия.
У него расширенная клавиатура и есть 6 линия
Ясно. Но это сможет использовать только специально "обученный" софт, стандартный про такое ни сном, ни духом.
А порт #FE там выше на скрине - это результат общего чтения вида XOR A: IN A,(#FE) ? Линия действительно залипшая...
это сможет использовать только специально "обученный" софт
судя по описанию
"В драйвере клавиатуры CP/M для Профи используется дополнительный бит порта клавиатуры,
который здесь обозначен как d6 (6-ой бит во внутреннем тесте клавиатуры Профи)
Lethargeek
01.02.2022, 15:51
"В драйвере клавиатуры CP/M для Профи используется дополнительный бит порта клавиатуры,
который здесь обозначен как d6 (6-ой бит во внутреннем тесте клавиатуры Профи)
ну уж линии ШД испокон нумеровали с нуля, ну как так
вот ещё
спустя столько лет тут выяснил, что в платах версии 3.2 и наверное 3.1 дополнительный бит порта клавиатуры (контакт 2 KD5) идет на 18 ногу ИР23 (это 7 бит порта FE), а в платах 4ре и выше идет на 14 ногу ИР23 (это 5 бит порта FE), вообщем биты перепутаны почему и зачем не известно, наверное в CP/M на разных версиях плат будет работать немного по разному доп кнопки ?
еще момент некоторые загрузчики с магнитофона вроде защищенных могут повесить микроконтроллер, точнее я не знаю какие биты они опрашивают, но контроллер конфликтует и либо виснет плюс загрузка не происходит нормально, интересно где конфликт возникает
Spectramine
01.02.2022, 16:37
Даже расширенная линия клавиатуры должна давать 1 при ненажатой клавише, 0 при нажатой. Ну по идее, по крайней мре, может, создатели Профи пошли своим путем.
https://s.micp.ru/g59Ff.jpg
Отпаял доп.линию. Мда. Значит с матрицей не сильно повезло :))
Ну и ладно. Сейчас тест запущу.
https://s.micp.ru/kx5h9.jpg
Сейчас не самый устойчивый в плане флагов проц установлен, но как видно 102 и 103 - OK
Lethargeek
01.02.2022, 20:04
Ну и ладно. Сейчас тест запущу.
какой конкретно тест? именно только full и ccf интересны
почему-то ауты засбоили?? или в прошлый раз другой камень был?
хотелось бы сперва увидеть всё же результаты более стабильного
прежде чем кипишить опять на спектрумкомпутинге)
Не совсем по программированию, но пусть будет тут.
Подключаю, значит, в Unreal образы дисков (TRD). Указываю в конфиге (Unreal.ini) путь в подкаталог, имена файлов. Задал образы для A: и B: - все работает.
Произвожу изменения, т.е. форматирование или запись файлов внутри эмулятора. При закрытии эмуля (либо попытке вручную из меню перезаписать образ) выдается ошибка: Error while selecting file. Code is 0x00003002
Чего ему не нравится?
Evgeny Muchkin
07.03.2022, 11:24
reddie, мож, версия анрила глючная какая?
мож, версия анрила глючная какая?
Да не наблюдалось, вроде до этого образы, открываемые в самом эмуле по F3, сохранялись.
Только по F3 всегда диск А: почему-то загружается, даже если текущий дисковод другой. Остальные либо через ini, либо вручную через меню Beta128
Пока решил проблему, разместив образы в главном каталоге (с эмулем). Загрузку из подпапок он понимает, но записывать в них не хочет.
Глупый вопрос: а как замутить что-то наподобие автоверсии при сборке проекта, ну или при коммите на гитхаб? Где-то хранить версию программы, и чтобы она автоинкрементировалась при сборке, или при каком-либо другом событии? Конкретно - VSCode+DeZog, а так, в принципе, без разницы. Интересно, или это вообще возможно, если сам IDE не представляет такой возможности. Не знаю... средствами LUA, скриптами какими-то, командами препроцессора, или ещё чем-нибудь?
если локально (без систем контроля версий) - батниками перед компиляцией создавать нужный файл с нужным содержимом.
если с системой контроля версий (насколь я помню - но ни разу не пользовался) там есть "ключевые слова" которые обновляются при "коммите/чекауте". как то так.
ИМХО.
https://marketplace.visualstudio.com/items?itemName=nicola-granata.version-boss
Bedazzle
14.06.2022, 17:13
если локально (без систем контроля версий) - батниками перед компиляцией создавать нужный файл с нужным содержимом.
У меня так в батнике:
set dt=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
set dt=%dt: =0%
set dt=%dt:_= %
echo | set /p="%dt%" > __build.bin
и потом в асме
IFDEF SHOWBUILD
PRINT_AT #12, #02
DB 'build:'
PRINT_AT #13, #02
INCBIN "__build.bin"
ENDIF
https://i.imgur.com/HO6tDuQ.png
Вопрос про организацию задержки с помощью HALT. Вроде бы все правильно сделал, но почему запускается только из отладчика MONS c breakpoint на RET, из SOS почти всегда просто зависание происходит. Вот текст программы:
EI
LD B, 10
BLINK:
PUSH BC
LD A, 02
OUT (#FE), A
LD B, 25
WAIT1:
HALT
DJNZ WAIT1
LD A, 07
OUT (#FE), A
LD B, 25
WAIT2:
HALT
DJNZ WAIT2
POP BC
DJNZ BLINK
RET
из SOS почти всегда просто зависание происходит.
где эта программа размещается ?
адрес стека ?
как вызывается из бейсика ?
На эмуляторах Fuse и Unreal. На реальном уст-ве не проверял, там все разобрано. (
- - - Добавлено - - -
Адрес E000h, вызывается стандартно RANDOMIZE USR 4096*14 (адрес не могу запомнить надолго :) ). Стек не отслеживал, делал ресет, потом загрузка бинарного файла с "ленты", потом запуск.
Если интересно, могу tap файл выслать.
Black Cat / Era CG
02.09.2022, 22:38
LD B, 10
BLINK:
PUSH BCПуш если поставить перед меткой?
- - - Добавлено - - -
поменять строчки местами.
В этом случае программа будет не правильно работать, стек используется для хранения оставшегося кол-ва миганий.
Если интересно, могу tap файл выслать.
можно и просто прикрепить к сообщению
Хорошо, прикладываю
77745
вызывается стандартно RANDOMIZE USR 4096*14 (адрес не могу запомнить надолго )
будешь смеяться, но специфика ZXбейсика такова что твоя конструкция вызывает подпрограмму по адресу 4096.
как вариант используй randomize usr (4096*14)
будешь смеяться, но специфика ZXбейсика такова что твоя конструкция вызывает подпрограмму по адресу 4096.
как вариант используй randomize usr (4096*14)
:) Спасибо, все работает сейчас.
будешь смеяться, но специфика ZXбейсика такова что твоя конструкция вызывает подпрограмму по адресу 4096.
как вариант используй randomize usr (4096*14)
Это как?! А можно пояснить почему?
- - - Добавлено - - -
Я просто сроду не вызывал usr с вычисляемым выражением.
Потому, что по внутренней логике USR -- это функция, а у вызова функции приоритет выше, чем у любой другой операции. Поэтому без скобок это будет исполнено как RANDOMIZE ((USR(4096)) * 14).
Если расставить все подразумевающиеся скобки.
Black Cat / Era CG
03.09.2022, 21:34
Будет взят BC вроде, умножен на 14 и брошен на SEED) Вроде так.
Простейшая сферическая программа, три с половиной строки:
10 CLEAR 24576
20 LOAD "" CODE 32768
30 LET n=USR 32768
40 SAVE "results" CODE 49152,n
20-й строкой загрузили кодовый блок, 30-й строкой запустили на исполнение.
После исполнения программа по RET возвращается в бейсик и в 40-й строке записывает результаты. Все.
Это все прекрасно работает в zx48, включая запись.
В zx128 это тоже работает, но только до окончания работы кодового блока, потом сброс.
Елси же zx128 запустить в режиме basic48 - то тоже все нормально.
Вопрос. Что не так с возвратом в бейсик в zx128 ? Кодовый блок что-то портит в переменных zx128 ? половинки регистров X\Y ?
Это лечится или сойдет и так?
zebest, Бейсик часть вроде нормальная. Надо кодовую часть смотреть. Не портит ли память 5B00..5BFF? Не щёлкает-ли портом 7FFD? Второе маловероятнее.
Бейсик часть вроде нормальная. Надо кодовую часть смотреть.
Да, Бейсик нормальный. Похоже при запуске из basic128 портится адрес возврата в него же. В кодовой части даже подпрограмму нашел, после которой падает, но на этом и все, не по сеньке шапка это исправить. Да и особо не надо. Это так, еще один из разряда нюансов и особенностей различных моделей.
Не могу вспомнить название программы под винду, редактор спековского асма, позволяет просматривать код в несколько столбцов текста на экране, следующих один за другим, мега удобная весчь! прога называлась как-то типа ZX ASM STUDIO или что-то вроде того. Яндекс мне не помог.. :(
уже спрашивала на другом форуме, но пока не определилась
Племянник интересуется темой компьютеров, процессоров. Постоянно смотрит ролики на ютуб, пытается что-то паять. Я бы хотела, что бы он начал с исторических азов. Мы обсуждали и он хочет собрать компьютер своими руками. Я обещала помочь спаять (у меня есть опыт пайки плат на десяток дип микросхем, но правда оживляла их не я :-)
Пожалуйста, посоветуй модель самого простого одноплатного компьютера с минимальным количеством деталей и доделок. Знакомый предлагал платы Ленинград или РК86. Мы посмотрели и понимаем что такое пока очень сложно.
Совместимость и возможность компьютера не важны. Главное, подключение клавиатуры и вывод на экранчик или монитор, пусть даже текстовый или черно-белый. Ну и что бы был Бейсик или ассемблер, ведь наверно ему будет интересно не только спаять, но и что-то поделать, что бы захотеть большее развиваться.
Еще важно без ПЛИС и пр. новодельщины. Что бы на микросхемах и процессоре дип 2,54мм и с уже разработанной или что лучше может купить уже готовую плату. Микросхемы и детали найдем как-нибудь (есть откуда :-) ).
Заранее всем благодарна за рекомендации.
уже спрашивала на другом форуме, но пока не определилась
Племянник интересуется темой компьютеров, процессоров. Постоянно смотрит ролики на ютуб, пытается что-то паять. Я бы хотела, что бы он начал с исторических азов. Мы обсуждали и он хочет собрать компьютер своими руками. Я обещала помочь спаять (у меня есть опыт пайки плат на десяток дип микросхем, но правда оживляла их не я :-)
Пожалуйста, посоветуй модель самого простого одноплатного компьютера с минимальным количеством деталей и доделок. Знакомый предлагал платы Ленинград или РК86. Мы посмотрели и понимаем что такое пока очень сложно.
Совместимость и возможность компьютера не важны. Главное, подключение клавиатуры и вывод на экранчик или монитор, пусть даже текстовый или черно-белый. Ну и что бы был Бейсик или ассемблер, ведь наверно ему будет интересно не только спаять, но и что-то поделать, что бы захотеть большее развиваться.
Еще важно без ПЛИС и пр. новодельщины. Что бы на микросхемах и процессоре дип 2,54мм и с уже разработанной или что лучше может купить уже готовую плату. Микросхемы и детали найдем как-нибудь (есть откуда :-) ).
Заранее всем благодарна за рекомендации.
Ленинград оптимальный вариант. Их в 90-е чуть ли не с 10 лет паяли и запускали ребята.
Если что есть чат в телеграме по Ленинграду, уверен что завсегдатаи помогут пройти по всем шагам, от закупки комплектующих до сборки и наладки.
Как вариант можно попробовать схему LUT216, микросхем там меньше и наладка вроде бы не требуется, но паять БМК сложнее, да и дохнут они от любого чиха.
- - - Добавлено - - -
[SPOILER=offtopic]
Еще важно без ПЛИС и пр. новодельщины. Что бы на микросхемах и процессоре дип 2,54мм и с уже разработанной или что лучше может купить уже готовую плату. Микросхемы и детали найдем как-нибудь (есть откуда :-) ).
Заранее всем благодарна за рекомендации.
У меня была мысль сделать обновленную версию Ленинграда, для вот таких современников. Но немного доработанную с модульной структурой, что бы как лего можно было новые возможности добавлять, от SD карты до звукового чипа и пал кодера.
Кто то пишет что Ленинград не так и просто запустить. Да и 40 микросхем мы точно не осилим. Нам ведь не нужно на нем играть.
Без "новодельщины" не получится мало микросхем. Посмотрите тему про Sizif-512. Там всего одна "легкая" Alter-а. Что-то можно на плату и не ставить( правда наверное встроенное ПО придется менять под это). Можно с автором наверное пообщаться на эту тему как сделать вариант "лайт"
Если просто попрограммировать - возьмите эмулятор.
Если просто попрограммировать железный z80 - подключите сам чип z80 к Arduino, или к чему-то подобному( в интернете есть несколько подобных решений).
В принципе в этому случае...
Вам к десктопу или ноутбуку нужен только преобразователь usb в параллельные входы/выходы и соответствующий софт. Запитать z80 сможете через usb, тактировать через один из выходов. Если цель не игры запускать для развития очень интересный проект и устройство получите всего из нескольких микросхем. Можно просто микроконтроллер с USB на борту для этого приспособить. Но тогда это будет ближе к варианту подключения к Arduino. Скорость выполнения реальную наверное не получите, хотя если через USB3.x...
Зато на память и на экраны ограничений никаких не будет! :) и племянник после успешной реализации такого проекта станет супер проектировщиком. А Вам паять будет легко. Может даже что-то заработаете на таком девайсе. Потому что точно так можно любой ретро- CPU подключить и диагностику микросхем почти любых (особенно которые без jtag) делать.
Кто то пишет что Ленинград не так и просто запустить. Да и 40 микросхем мы точно не осилим. Нам ведь не нужно на нем играть.
Скажите, а в чем разница спаять один раз 10 микросхем, или 40 за 4 подхода? (вечера)
Запустить помогут ребя в упомянутом чате, такой тех поддержки как там, вы ни по одному компьютеру больше не получите.
- - - Добавлено - - -
Вот спектрум с минимумом микросхем и все еще на советской элементной базе:
https://pbs.twimg.com/media/DW6EzrbX0AEyvfQ.jpg
уже спрашивала на другом форуме, но пока не определилась
Племянник интересуется темой компьютеров, процессоров. Постоянно смотрит ролики на ютуб, пытается что-то паять. Я бы хотела, что бы он начал с исторических азов. Мы обсуждали и он хочет собрать компьютер своими руками. Я обещала помочь спаять (у меня есть опыт пайки плат на десяток дип микросхем, но правда оживляла их не я :-)
Пожалуйста, посоветуй модель самого простого одноплатного компьютера с минимальным количеством деталей и доделок. Знакомый предлагал платы Ленинград или РК86. Мы посмотрели и понимаем что такое пока очень сложно.
Совместимость и возможность компьютера не важны. Главное, подключение клавиатуры и вывод на экранчик или монитор, пусть даже текстовый или черно-белый. Ну и что бы был Бейсик или ассемблер, ведь наверно ему будет интересно не только спаять, но и что-то поделать, что бы захотеть большее развиваться.
Еще важно без ПЛИС и пр. новодельщины. Что бы на микросхемах и процессоре дип 2,54мм и с уже разработанной или что лучше может купить уже готовую плату. Микросхемы и детали найдем как-нибудь (есть откуда :-) ).
Заранее всем благодарна за рекомендации.
Человеческий совет. Купите, на том же "Ozon"-е наборы-конструкторы "Ленинград-1" или "Pentagon-128". В сборке неприхотливы. Если не "заладился", то всегда сможете на форуме прочитать советы по исправлению ошибок пайки и советы по наладке. А удовольствие от сборки получите точно на 100%.
Ага! 7399р и 18424р...однако!
https://zx-pk.com/forum/viewtopic.php?f=7&t=790
Вот спектрум с минимумом микросхем и все еще на советской элементной базе:
где?
Ага! 7399р и 18424р...однако!
И что? На той же "Барахолка" на 500-1000 рублей меньше, но при почтовых расходах и пересылке как раз по цене на "Ozon" получится.Так и цены растут. Можно и чистую печатную плату купить и "собирать" постепенно компьютер. Это кому как! Есть ещё и "Авито", хотя оттуда что угодно может прийти в посылке.
"len04ka". Попробуйте такие варианты покупки. Или на "Алиэкспресс" чистые печатные платы, либо на "Ozon" или "Барахолка" (если есть там регистрация) в виде конструкторов. "Ленинград-1" или "Pentagon-128", это самое то для понимания структуры и логики работы компьютера. Но это Вам выбирать. А желание у племянника хорошее.
CodeMaster
10.01.2023, 12:45
Пожалуйста, посоветуй модель самого простого одноплатного компьютера с минимальным количеством деталей и доделок.
Что-то типа Аюша-Z80 (https://zx-pk.ru/threads/29372-ayusha-z80-sr-m-sovmestimyj-kompyuter.html)? На него вроде даже платы разводили.
Есть ещё компы на минималках на разных процах от Ewgeny7, но они никак не документированы, паяны МГТФом и содержат GAL'ки. Для начала не пойдут, но потом возможно будет интересны для знакомства с процессорами разной архитектуры.
Что-то типа Аюша-Z80 (https://zx-pk.ru/threads/29372-ayusha-z80-sr-m-sovmestimyj-kompyuter.html)? На него вроде даже платы разводили.
Есть ещё компы на минималках на разных процах от Ewgeny7, но они никак не документированы, паяны МГТФом и содержат GAL'ки. Для начала не пойдут, но потом возможно будет интересны для знакомства с процессорами разной архитектуры.
Так похоже человек ничего изучать не хочет?.. А хочет просто спаять.
Таким образом можно смотреть на ардуино с DIP чипом.
Хоть и не по программированию, но вопрос довольно глупый :))
можно ли по ссылке на аттач найти темуу, где я это скачал??
https://zx-pk.ru/attachment.php?attachmentid=77437&d=1655015490
ну или кто автор сего теста, если точнее
наверное как-то можно
https://zx-pk.ru/threads/25139-contended-memory-i-prochie-tormoza-spektrumov.html?p=1155302&viewfull=1#post1155302
нее, мне не дано было найти))
Все верно, этот тест. У него обнаружилась интересная особенность, а испанцу как всегда автора подавай.
Спасибо!
если искать по номеру вложения, то результаты поиска будет не так сложно отсеять вручную
https://zx-pk.ru/attachment.php?attachmentid=77437&d=1655015490
Подскажите пожалуйста. Есть программа на бейсике, есть загрузчик, загрузочный экран, компилятор tobos-fp и скомпилированная из Wham музыка. Загружаю заставку, сам тобос по адресу 53100, скомпилированную бейсик-программу по адресу 40000, музыку по адресу 50000, запускаю музыку с адреса 50000, по нажатию клавиши запускаю программу с адреса 40000. И после уже музыку когда работает скомпилированная тобосом программа запустить уже никак нельзя? Зависает и сбрасывается. Или есть способы?
Enigmatic
12.10.2023, 19:53
Такой вопрос.
Если я сохраняю басик файл в тр-дос, например "10 PRINT 'hello' " , то при его запуске из тр-дос по какому адресу обращается компьютер, чтобы запустить эту сохраненную программу?
начало программы на бейсике берётся из переменной (PROGS)
а запуск зависит от указанного номера строки для старта
Когда сохраняешь, пиши:
SAVE "hello" LINE 10
и будет стартовать с 10-й
NEO SPECTRUMAN
14.10.2023, 22:58
а фотошоп можот отображать больше 8 бит на компоненту дизерингом при редактировании с зумом и без?
Загружаю заставку, сам тобос по адресу 53100
А перед этим RAMTop выставляете командой CLEAR 39999?
Enigmatic
20.10.2023, 09:51
Программа гасилка экрана, для чего используется цикл l2 ? Я думал это просто задержка, но почему именно #1800, чтобы попасть в такт возвращения луча на начало экрана или что?
begin ld b,8
ld c,#c7
loop
ld a,c
sub 8
ld (com),a
ld c,a
ld hl,22528
ld de,768
l1
ld a,(hl)
defb #cb
com
defb 0
ld (hl),a
inc hl
dec de
ld a,d
or e
jr nz,l1
push bc
ld bc,#1800
l2 dec bc
ld a,b
or c
jr nz,l2
pop bc
djnz loop
RET
UncleDim
20.10.2023, 12:25
почему именно #1800
да "на глаз" подобрано скорее всего (чтоб гасился не быстро и не медленно)
но почему именно #1800... Быдлокод потому что.(
В советских клонах есть какие-то особенности реализации Kempston-джойстика? Почему спрашиваю: в "Этюдах" вчера спрашивал программку курсора мыши. Нашел. Только виснет. В Спектакуляторе виснет, в ZesarUX виснет, в SpecEmu виснет, в ZxSpin виснет, в Fuse виснет, в Unreal... не виснет.
Вот и пойми, что это было - то ли заморские эмуляторы не учитывают каких-то особенностей отечественных клонов, то ли что другое.
Dart Alver
03.11.2023, 22:08
В советских клонах есть какие-то особенности реализации Kempston-джойстика? Почему спрашиваю: в "Этюдах" вчера спрашивал программку курсора мыши. Нашел. Только виснет. В Спектакуляторе виснет, в ZesarUX виснет, в SpecEmu виснет, в ZxSpin виснет, в Fuse виснет, в Unreal... не виснет.
Вот и пойми, что это было - то ли заморские эмуляторы не учитывают каких-то особенностей отечественных клонов, то ли что другое.
Так всё-таки джойстика или мыши ? ))
Скорее всего в тех эмуляторах не выставлена опция эмуляции порта kemston джойстика или мыши ?
По реализации джойстика отличия от клона к клону вполне себе имелись, но при правильно оформленном опросе порта, они себя не проявляют.
По отличиям. Во многих наших клонах заюзана микруха дешифрующая порт джойстика по короткому адресу #1F и выводит данные на все 8 разрядов 0 - не значащие, остальные состояние кнопки.
Но бывает и такое - если порт не перехватил какой-либо дешифратор, то все оставшиеся нечетные порты - kempston джойстик, а вывод данных : значащие разряды - состояние кнопок, а незначащие - мусор от юлы (остатки атрибутов типа). Некоторые старые забугорные проги опрашивали джойстик через порт #DF, и тогда в них не работал джойстик на наших клонах с #1F.
А в классике вроде вообще по умолчанию этого порта нет - дополнительно ставится.
Джойстика или мыши. В программе опрашивается порт 1f, значит, джойстик. На экран выводится курсор мыши - значит, мышь.
Специально в Спектакуляторе и Fuse и отключал Kempston, и включал - никакой разницы. В Fuse виснет сразу же, в Спектакуляторе - после того, как пробежит ровно 2 (вроде. Или 3) знакоместа. Странно.
В общем, вот эта гадость мешала Спектакулятору, когда там был выставлен Kempston:
https://i.postimg.cc/vZVJBqwH/2023-11-03-213213.png (https://postimages.org/)
видать, что-то там у него с чем-то конфликтовало.
Что там с Fuse и всем остальным, теперь не интересно.
Dart Alver
03.11.2023, 22:28
Ну х.з. конечно, но врят ли проблема именно в эмуляции порта, скорее какая-то сопутствующая.
Enigmatic
04.11.2023, 08:32
0xDEAD, может из-за обработчика прерываний виснет? Читал, что на фирменных машинах с ula есть особенности с ними. А в программе обработчик выдран из книги "как написать игру..."
Программа в IM1 работает.
Как научится доделывать свои проекты?
Как научится доделывать свои проекты?
Берёшь и доделываешь!)
Spectramine
17.11.2023, 14:51
Как научится доделывать свои проекты?
Не светить промежуточные результаты, это сильно демотивирует в доделывании. Если уже светил, поудалять. Определиться с тем, какой твой интерес в доделывании - по приколу, поставить галочку "завершено", и т.п. Вспомнить, что было мотивацией для начала работы над проектом. Очень мотивирует, если сам хочешь пользоваться тем, что делаешь (для игры - сам хочешь играть в неё).
Ну и ничего страшного нет в том, чтобы забить на недоделанный проект, если он делался ради интереса, а интереса больше нет.
UncleDim
17.11.2023, 18:47
Кто такой генерал Фэйлур и почему он читает мои данные??
Связка срам-цплд, читаем из ОЗУ по одному адресу и тут же, следующим тактом, записываем по другому, нигде не запоминая результат чтения(т.е. на ёмкостях монтажа только). Кто-нить пробовал?
"Нужны приключения ? Они есть у меня..." (с)
UncleDim
17.11.2023, 22:45
приключения ?
да, частота 20-30 Мгц
Забудьте про чтение-запись на "лету". сиё крайне не технологично.
Enigmatic
24.11.2023, 16:28
Почему на Спектруме не реализовали яркость чёрного цвета?
Почему на Спектруме не реализовали яркость чёрного цвета?
формально бит яркости для сброшенных битов цвета в атрибуте может отражаться неочень качественным цапом и можно бывало увидеть черные и менее черные знакоместа на телеках
Почему на Спектруме не реализовали яркость чёрного цвета?Это позволяет отображать яркие и неяркие цвета на однородном черном фоне. В противном случае это было бы невозможно, поскольку флаг Bright общий для Inc и Paper в байте атрибутов знакоместа.
UncleDim
25.11.2023, 02:22
крайне не технологично
"зато дешево, надежно и практично" (с))
т.е. опробовал, работает
(а пуркуа бы и не па, работает же в синклерах "порт FF" на частотах, меньших на порядок..)
- - - Добавлено - - -
не реализовали яркость чёрного цвета?
"есть мнение", что слишком много тогда комбинаций вполне разборчивых на цветном, но не очень на черно-белом тв.
"есть мнение", что слишком много тогда комбинаций вполне разборчивых на цветном, но не очень на черно-белом тв.дело не большом числе комбинаций, а в механизме формирования яркостного сигнала. В оригинальном ZX Spectrum 48 разница между уровнями яркого и обычного цветов отличается в зависимости от цвета. Для черного цвета (если отключить блокировку яркости для него) эта разница действительно минимальна. Но даже в этом случае она заметна на экране телевизора (как цветневого, так и черно-белого).
Для совместимости с Ceefax (телетекстом) Ричард Альтвассер ориентировался на их палитру при разработке видеоввода ZX Spectrum. Можно посмотреть на картинку телетекста (или прочитать описание стандарта):
http://teletext.mb21.co.uk/gallery/ceefax/bbctest_animated.gif
Для формирования телетекста использовались максимально яркие цвета на темном фоне. Если бы ZX Spectrum имел "яркий-черный», то цвет поля экрана отличался бы от черного цвета рамки (бордюра).
вот пример использования BlackBright
https://blogger.googleusercontent.com/img/a/AVvXsEhp0K-m2iWPNXpbGCIHWVyUiY-99UGX3DYOCFLQl-uRkTWbx2CWOpa1uEPVeDY554xGPlpCFbYEBTXElE9IW47YRbPI FVWvNkP-XIYQ1uYnIZr2C1YJ_v3dSTfEvFcGotxEbDuErU1XCX9mgZcvtt ffX2baxFxxHwRC3kQq9tD5ouj3wQNsMFnc4q2e=w640-h512
поймав его прорисовку (через порт#FF ) можно смело перерисовывать основной экран
Lethargeek
25.11.2023, 23:24
Для совместимости с Ceefax (телетекстом)
как что-то хорошее и офигенно необходимое :rolleyes:
Enigmatic
10.12.2023, 15:25
Существует ли в природе утилита или редактор на спектруме или пк, чтобы по наведению курсора по экрану показывало адрес пикселя и атрибута в 16-ричном значении?
NEO SPECTRUMAN
10.12.2023, 17:11
Почему на Спектруме не реализовали яркость чёрного цвета?
потому что ТАК НАДА
иначе юзабельных цветов было бы только 8
https://i.postimg.cc/rs5Jp5LN/Timex-Sinclair-2068.jpg
нужно спрашивать по другому
какой ДЕБИЛ додумалсо сделать гребанный флеш вместо раздельного брайта с этим вашим ярким черным?
НУ ТУПЫЕ (С)
Black Cat / Era CG
10.12.2023, 17:25
Существует ли в природе утилита или редактор на спектруме или пк, чтобы по наведению курсора по экрану показывало адрес пикселя и атрибута в 16-ричном значении?
Так умеет Эмуль Xpeccy. Там два варианта: либо зажать мышь в основном окне и водить ей, тогда слева внизу будут адреса, либо открыть дебаггер и просто ткнуть в основное окно. На скрине 1 вариант
https://pic.maxiol.com/images2/1702218293.1839929489.xpecattr.png
Dart Alver
10.12.2023, 17:50
Существует ли в природе утилита или редактор на спектруме или пк, чтобы по наведению курсора по экрану показывало адрес пикселя и атрибута в 16-ричном значении?
На нативе или в эмуле для скринов BGE умеет.
Опция "Адресация" ( В версии 3.11 и раньше это во "всяком", а в 3.12 demo в "экранах" ). В 3.12 demo для более точного выбора пикселя можно минилинзой воспользоваться (клавиша 'M').
https://pic.maxiol.com/thumbs2/1702219395.3557004871.adro.png (https://pic.maxiol.com/?v=1702219395.3557004871.adro.png&dp=2)
В верхней части адреса начала знакоместа, а в нижней конкретного пикселя. (нет только значения ячейки пикселя и маски пикселя)
Какой может быть алгоритм изменения (увеличения) скорости стрелки при управлении от клавиатуры?
один из вариантов
подбираются индивидуально
LenSpd = 8 задержка перед сменой скорости
MaxSpd = 5 количество скоростей
на входе:
3,a =1 up
2,a =1 down
1,a =1 right
0,a =1 left
на выходе:
d - приращение координаты Y со знаком
e - приращение координаты X со знаком
ld d,a
ld c,#00
and #0F
CH04_01 ld a,#00
jr nz,GT04_01
xor a
GT04_01 cp LenSpd*MaxSpd-#01
adc a,c
ld (CH04_01+#01),a
LP04_02 inc c
sub LenSpd
jr nc,LP04_02
xor a
ld e,a
sub c
ld b,a
ld a,d
ld d,e
rrca
jr nc,GT04_02
ld e,b
GT04_02 rrca
jr nc,GT04_03
ld e,c
GT04_03 rrca
jr nc,GT04_04
ld d,b
GT04_04 rrca
jr nc,GT04_05
ld d,c
GT04_05
А подскажите , нет ли хака для Soldier of Fortune, что бы пользуясь геймпадами на кемстон интерфейса, перемапить прыжок не на "вверх" а на любую другую кнопку ? Или по факту с кемпстоном это анрил и только 1 кнопка ?
пользуясь геймпадами на кемстон интерфейса, перемапить прыжок
все игры с поддержкой "расширенного" кемпстона (https://vtrd.in/search.php?search=%23kemp8bit) - где-то прыжок отдельно, где-то отдельная кнопка за доп.действие отвечает.
перемапить прыжок не на "вверх" а на любую другую кнопку
в Next'e есть "Keyjoy" - там можно на любую кнопку джойстика "перемапить" любую кнопку клавиатуры (но не кемпстона).
Black Cat / Era CG
16.04.2024, 17:24
На Эволюшен тоже сегапад можно на клаву ремапить.
Я не знаю, есть ли у kas1e Ева, но Некст у него точно есть. Поэтому только про него и написал.
Black Cat / Era CG
16.04.2024, 23:00
А. Ок :)
все игры с поддержкой "расширенного" кемпстона (https://vtrd.in/search.php?search=%23kemp8bit) - где-то прыжок отдельно, где-то отдельная кнопка за доп.действие отвечает.
в Next'e есть "Keyjoy" - там можно на любую кнопку джойстика "перемапить" любую кнопку клавиатуры (но не кемпстона).
Нашел в основном меню некста, что можно на left/right joy выбрать Keyjoy, это оно ? Напиcано, что по дефолту замаплено на QAOP SPACE, но пока хз как выбрать кнопки джоя.
Или ты про то меню что по shift+enter когда игру запускаешь ? Там тоже вижу есть Joy setup, но чето чтобы я не выбирал , на keyjoy setup реакции от джостикового стика и почти всех кнопок нет.
Еще пропробовал NMI кнопку в после как игру запустил, там тоже захожу в settings , joystinck, выбираю left keyjoy, settings for left keyjoy, и никакая кнопка кроме x/y/z или стик не реагируют вообще. Причем, первый раз x/y/z кнопки еще реагируют, а если выйти и зайти, то уже нет, и надо ребут. Или эти единственные 3 реагирующие кнопки могут выдавать иногда просто Z всегда, и надо ребут, чтобы был Z/X/Y. Но опять же, стик не реагируют, и основные кнопки тоже (хотя если выбираю кемпстон, то все работает).
Есть в целом путь какой-то как сделать так чтобы скажем выбрать в солдате фортуны курсор или синклайр, и запамить эти кнопки клавы на стик и кнопки джойпада ?
ps. Эвы нет да, только некст
Есть в целом путь какой-то как сделать
в NMI-меню в разделе Joystick в пункте JoyL (или JoyR или оба) нужно выбрать Keyjoy. тогда будут работать те настройки, что выбраны в Keyjoy L (К) Setup.
Это будут общие настройки для всех игр.
Через меню появляющееся при загрузке .tap/.tzx/.sna/.z80 можно задать настройки для конкретной игры.
при
Left (Right) joystick: default - настройки будут браться общие - см. NMI-меню.
Left (Right) joystick: Kempston/Sinclair/Cursor/MD - джойстик будет эмулировать соответствующий.
Left (Right) joystick: Keyjoy - будут работать кнопки выбранные ниже.
https://i.postimg.cc/sx2Zsf17/keyjoy.gif (https://postimages.org/)
выбрав один раз настройки для .tap/.tzx в следующий раз выбирать уже не нужно
- - - Добавлено - - -
по дефолту замаплено на QAOP SPACE, но пока хз как выбрать кнопки джоя
замапить можно только клавиши. "кнопки" кемпстона замапить никак.
Так я не про мап джоя на клаву, я про ремап джоевского. Пусть будет что угодно - синлайр, курсор и тд. Мне главное сделать чтобы вверх на джойстике в солдате фортуны стал любой кнопкой джоя, а кемпстон или синклайр, или что еще пох. Или такое не возможно с джоем и только ремапится на клаивиатуру ? Мне ремап нужен именно на джой, не на клаву.
Т.е. поменять вверх на вторую кнопку джоя, пох как (кроме паяния конечно)
Или такое не возможно с джоем и только ремапится на клаивиатуру ? Мне ремап нужен именно на джой, не на клаву.
ну блин... я ж картинку даже приложил - в данном примере при нажатии вверх на джойстике (реальном джойстике подключенном в левый порт Next'а) - будет "нажиматься" W, в солдате фортуны нужно переопределить клавиши так же, что б W отвечала за вверх или прыжок.
можно замапить на кнопку вверх цифру 9 (вверх на Sinclair Joy 2) или цифру 4 (вверх на Sinclair Joy 1), и все остальные кнопки тоже замапить на соответствующие Sinclair Joy 1 или 2. Кемпстон только нельзя в таком режиме привязать к кнопкам реального джойстика.
Я когда в меню ремапа (как у тебя на картинке), жму "е" для лефта, у меня никакого изменения когда джоем жму верхнизлевоправо нет. Только 3 кнопки реагируют, и то не основные. Джой 8бит дуо, в левом порту (в левом если смотреть на некст)
Джой 8бит дуо, в левом порту (в левом если смотреть на некст)
https://youtu.be/GojC8e9qhi4
- - - Добавлено - - -
Только 3 кнопки реагируют, и то не основные
https://i.postimg.cc/8kq24hZQ/keyjoy2.gif (https://postimages.org/)
вот тут точно keyjoy выбран???
если там default или kempston, то на кнопки XYZ на джойстике будут вызывать "нажатие" соответствующих клавиш клавиатуры.
- - - Добавлено - - -
жму "е" для лефта, у меня никакого изменения когда джоем жму верхнизлевоправо нет.
#$%! ты что пытаешься джойстиком там что-то выбрать? )))
#$%! ты что пытаешься джойстиком там что-то выбрать? )))
Да, была надежда что это классический ремап - нажал кнопку на джое - отобразилось. А оно походу спектрумовское совсем - просто буквами на клаве менять их мап на джой, а не джоем самим жать :)
просто буквами на клаве менять их мап на джой, а не джоем самим жать
да так как-то удобнее как раз - сразу выбрал кнопку нужную, чем кнопками влево-вправо выбирать нужную клавишу из 40 возможных.
да так как-то удобнее как раз - сразу выбрал кнопку нужную, чем кнопками влево-вправо выбирать нужную клавишу из 40 возможных.
Я сначала просто думал что это классическое переназначение кнопок джоя , а это просто копия клавовых кнопок на джой, т.е. под каждую игру надо смотреть какие там кнопки будут, и уже делать. Но теперь крутяк солдата фортуны играть где кнопка огонь и кнопка прыгать , клево!
вопрос новичка: а есть под виндовс какая нить ide для программирования на ассемблере под z80 ?
что нить в одном флаконе ?
Для z80 или для ZX-Spectrum?
вопрос новичка: а есть под виндовс какая нить ide для программирования на ассемблере под z80 ?
что нить в одном флаконе ?
https://youtu.be/Gerd209yR-M?si=SwmJPvhZv7Rm613s
Для z80 или для ZX-Spectrum?
Z80
нужно написать что то типа bios для своего проекта
- - - Добавлено - - -
видео
вообще не понял к чему это видео... какой то процесс с середины, что там настроено, как, не понятно совершенно.... меня интересует ide для написание программ на ассемблере, с поддержкой множества символов, навигации по файлам, подсветкой кода, компиляцией в бинарники для последующей прошивки
p.s. блин, неужели ничего на подобие моего ArmAsmEdit для Z80 нет ? то есть все чуть ли не в блокноте (FARe) редактируют код ?! афигеть :-(
UncleDim
20.08.2024, 08:48
се чуть ли не в блокноте (FARe) редактируют код ?
https://marketplace.visualstudio.com/items?itemName=mborik.z80-macroasm
вообще не понял к чему это видео... какой то процесс с середины, что там настроено, как, не понятно совершенно.... меня интересует ide для написание программ на ассемблере, с поддержкой множества символов, навигации по файлам, подсветкой кода, компиляцией в бинарники для последующей прошивки
p.s. блин, неужели ничего на подобие моего ArmAsmEdit для Z80 нет ? то есть все чуть ли не в блокноте (FARe) редактируют код ?! афигеть :-(
плохому тонцору, пол не ровный...
- - - Добавлено - - -
если ты в этом видео ничего не подчеркнул, то могу только посочувствовать.
- - - Добавлено - - -
пользуйся блокнотом, желательно бумажным и навигируйся - листая его
Andrey_PROFI
23.08.2024, 12:48
Deadly, Вы правы !)) Но нынешним танцорам подавай сразу яхту, видете ли)) Их не смущает, что Z80 старше их самих))
Deadly, Вы правы !)) Но нынешним танцорам подавай сразу яхту, видете ли)) Их не смущает, что Z80 старше их самих))
вы друг друга стоите. один выкладывает видео с середины установленной уже среды - то есть бесполезнее некуда,
второй флудит...
по делу же оба написали меньше чем ничего...
у вас в жизни проблемы с чсв что ли ?
вы друг друга стоите. один выкладывает видео с середины установленной уже среды - то есть бесполезнее некуда,
второй флудит...
по делу же оба написали меньше чем ничего...
у вас в жизни проблемы с чсв что ли ?
В вашем посту есть реклама ArmASmEdit и непонятный пассаж про блокноты
Не нравится VS code
возьмите TommyGun (https://github.com/tonyt73/TommyGun)
у ZX Spin есть ассемблер и отладчик.
один выкладывает видео с середины установленной уже среды - то есть бесполезнее некуда
Мне записать видео как устанавливать плагины в vc?
- - - Добавлено - - -
А ещё есть описание к видео
- - - Добавлено - - -
Открываешь браузер, вбиваешь, что такое visual code, как навигироваться в visual code, читаешь книгу как написать программы на ассемблере.потом спрашиваешь, что такое компиляторы z80, наткнешься о чем я говорю о саджасме, далее пару кликов и ты находишь документацию по саджасму. параллельно правой ногой ты навигируешься в интернете и левым глазом читаешь что такое ide vc и как там плагины ставятся. далее в поисковике ide вхерачиваешь z80 и мля получаешь список доступных плагинов, далее проходишься по всем им читаешь мануалы, вдупляешь что тебе нужно и мля ты уже начинаешь задавать правильные вопросы, а потом уже посмотри видяху. И тупые вопросы отподут.
- - - Добавлено - - -
Но вообще советую пользоваться тетрадкой, как правило компилятор не выдает ошибок и все чин чинарем, а после второй стопки уже и незачем разбираться, лучше я полежу пузо почему. Зачем напрягать мозг и т.п.
- - - Добавлено - - -
Но ты главное не унываей, при должном рвении и сноровке, ты сможешь задать в 21 веке правильные вопросы поисковику и разобраться как работать с иде и как там что.
Z80
p.s. блин, неужели ничего на подобие моего ArmAsmEdit для Z80 нет ? то есть все чуть ли не в блокноте (FARe) редактируют код ?! афигеть :-(
самое круто считается чисто в терминале linux на vim код педалить. :)
Для любителей есть всякие прибамбасы типа Alacritty terminal и всяких плагинов к vim...
vscode - это попытка MS скрестить VS и vim. Неудачная как по мне - ни рыба ни мясо получилось. До VS далеко, а на легковесный редактор явно не тянет, к тому же кучу данных собирает и на сервера MS отправляет. Есть opensource вариант с отключенной телеметрией - codium. Отладчик есть но туповатый и без многих фишек. Вобщем vscode/codium - это довольно тормозной редактор, хотя и значительно шустрее Eclipse, что особенно критично если машина слабая.
Eclipse - жутко лагающее громоздкое и глючное нечто, на слабой машине не юзабельно от слова вообще.
Оптимальный вариант geany editor - легковесный редактор, с поддержкой синтаксиса и даже парсингом для большинства языков. Но отладчика нет. Есть только кнопка компиляции запуска с возможностью настроить команды.
Отладчик чуть получше чем в vscode/codium в KDevelop, в нём-же красивая раскраска и глубокий парсинг с подсказками. Работает шустро, но глючноватый и большие c++ проекты на слабой машине парсит долго.
Отладчика аналогичного VS по удобству я не видел. Разве что Insight, но по удобству до VS ему далеко.
Что касается подсветки синтаксиса, то она и в nano есть, так что можно прямо в консоли код педалить. Очень шустро и легковесно, можно удаленно через ssh. Но copy/paste неудобно из-за особенностей терминала.
Dart Alver
01.09.2024, 22:29
Оптимальный вариант geany editor - легковесный редактор, с поддержкой синтаксиса и даже парсингом для большинства языков. Но отладчика нет. Есть только кнопка компиляции запуска с возможностью настроить команды.
Что не понравилось в этом редакторе - отсутствие настройки цвета вывода компилятора. На моей теме это вообще вырвиглаз, хотя все остальные вкладки смотрятся отлично.
По поводу отладчика, всегда есть вариант настроить запуск подходящего отладчика эмулятора. Повозится конечно надо, если надо конечно ))
А так я привык пользовать Crimson editor + sjasmplus + xpeccy. Но Geany заставляет задуматься, в некоторых местах оно даже лучше, если б не ненастраиваемый нечитабельный вывод ))
Мне хватает EmEditor+ужасм, который приспособлен к редактору.Ну и Spectaculator вслед(:
здравствуйте
подскажите самый простой способ подключить FDD 3.5" к Sintez-2
нужен контроллер , какой именно попроще? ВГ93 дефицит как понимаю. нет ли сейчас схем на PICах или типа того ?
Dart Alver
07.09.2024, 00:42
Что не понравилось в этом редакторе - отсутствие настройки цвета вывода компилятора. На моей теме это вообще вырвиглаз, хотя все остальные вкладки смотрятся отлично.
Упс. Оказывается это я болван. Настраивается через Инструменты/Файлы настроек/geany.css ))
Вопрос ультра-нуба.
Копирую DEFB массив атрибутов кастомной размерности в буфер по заданным координатам. Затем выплёскиваю его на экран.
Оффсет перехода на след. строку хардкодом задан. Как мне сделать так, чтоб его считала машина? Я бы мог конечно вычислять записывая в память. Но это слоупочно, а регистров не осталось свободных. Может сможете как-то оптимизнуть там через теневые/индексные регистры?
DRAW_ATTR
ld de, SPR_ATTR ; указатель на массив defb
ld c,3 ;шырина
ld b,5 ;высота
push bc
jp VIRT_ATTR
VIRT_ATTR
ld a,(_ATTRY)
ld b,a
ld a,(_ATTRX)
ld c,a
VIRT_ATTR_1
; расчет адреса атрибутов знакоместа в DE, B-вертик.координата, C-гориз.координата
LD A,B
RRCA
RRCA
RRCA
LD L,A
AND 31
; OR 88 ; 88*256=22582
OR 248 ; 57344+6144=63488/256=248
LD H,A
LD A,L
AND 252
OR C
LD L,A
pop bc
DRAW_SPR_1 push bc
ld a,(de)
inc de
;LD A,(_ATTRC)
LD (HL),A
inc hl
pop bc
dec c
jr nz, DRAW_SPR_1
push de
ld de, 32-8 ; ХАРДКОД
add hl,de ; на след. строку
pop de
ld c,8 ; ТОЖЕ ХАРДКОД
djnz DRAW_SPR_1
RET
VIRT_ATTR_TO_SCR
ld bc,768
ld de,16384+6144
ld hl, 57344+6144
ldir
RET
Lethargeek
17.09.2024, 02:02
Но это слоупочно, а регистров не осталось свободных.
перебрасывай строки лдиром - что освобождает аккумулятор для счётчика строк, а в bc после лдира будет нуль
и можно дважды в c грузить заранее рассчитанные значения, а вместо push-ldde-addde-pop будет exd-ldc-addbc-exd
окей. С этим разобрался.
Теперь хочу сделать атрибутный скроллер сверху вниз.
Если бы нужно было снизу вверх сделать, достаточно
ld hl,22528
ld de,22528+32
ld bc, 768
ldir
но учитывая специфику инкремента-декремента внутри лдира, придëтся копировать лишь снизу вверх по строкам.
ld hl,22528+736
ld de,22528+768
ld bc, 32
ldir
где в цикле нужно делать hl и de sub на 32. Как это делать наиболее шустро для парных регистров? Ну или может есть более элегантрое решение скролла (в конце мне нужно ещë и последнюю строку копировать на первую, ибо скролл циклический.)
Dart Alver
18.09.2024, 16:57
Испльзуй lddr вместо ldir в обратном порядке.
ldir/lddr это верное решение, но стек все же лучше.
Lethargeek
18.09.2024, 20:40
ldir/lddr это верное решение, но стек все же лучше.
ну тут атрибуты же, их немного; а если lddr развернуть в ldd-ldd (благо размер заранее известен) - тогда всё успеет перебросить еще на бордере
ещë один мега-дыбильный вопрос.
ld a,0
loop1:
inc a
jp po, loop0
; код программы, если флаг чëтный
loop0:
;продолжение кода
jp loop1
По задумке чëт/нечет должен переключаться при каждом инкременте, и соответственно перескакивать по условию. Но не перескакивает. Оно только для константных чисел работает что ли? Ну, типа, явное присвоение ld a, 228, например? Как мне щëлкать флаг в цикле, шоба пульсировало подобно мультивибратору?
По задумке чëт/нечет должен переключаться при каждом инкременте
Это хитрый флаг. Согласно букварю, при инкременте: P/V is set if r was 7FH before operation; reset otherwise.
При декременте: P/V is set if m was 80H before operation; reset otherwise. Т.е., при данных операциях это не паритет вовсе, а переполнение.
Lethargeek
19.09.2024, 01:03
По задумке чëт/нечет должен переключаться при каждом инкременте,
даже если бы на чётность работал для арифметики (как в 8080) - всё равно не переключался бы каждый раз
потому что это чётность кол-ва единичных битов в числе, а не самого числа
если всё же для условия непременно нужен именно как флаг чётности - сделай после инкремента and/or a
что-то аномалия какая-то у меня в процедуре закраски массивом атрибутов в области ректангла.
Есть такая процедурка. С ней всё ок. Тут выводит лишь отдельно взятый атрибут по указанным X|Y
ATTR
ld a,(_ATTRY)
ld b,a
ld a,(_ATTRX)
ld c,a
; расчет адреса атрибутов знакоместа в DE, B-вертик.координата, C-гориз.координата
LD A,B
RRCA
RRCA
RRCA
LD L,A
AND 31
OR 88
LD H,A
LD A,L
AND 252
OR C
LD L,A
LD A,(_ATTRC)
LD (HL),A
RET
Пробую то же самое уже для массива атрибутов из линейного DEFB сверху вниз/слева направо (правда тут иные регистровые пары используются, и рисуется в буфер), так почему-то при достижении позиции Y определённого значения оно перескакивает на начало экрана. Что-то не то в булевой алгебре AND OR
_SPR_H, _SPR_W - высота/ширина ректангла, соответственно.
ld hl, SPR_ATTR ;указатель на массив DEFB
ld a,(_SPR_Y)
ld d,a
ld a,(_SPR_X)
ld e,a
ld a,(_SPR_H)
ld b,a
PUTSPRITES2 push bc
push de
LD A,D
RRCA
RRCA
RRCA
LD C,A
AND 31
OR 242 ; 61952/256
LD B,A
LD A,C
AND 252
OR E
LD C,A
ld d,b
ld e,c
ld bc,(_SPR_W)
ld b,0
ldir
pop de
inc d
pop bc
djnz PUTSPRITES2
ret
Lethargeek
22.09.2024, 08:54
Пробую то же самое уже для массива атрибутов из линейного DEFB сверху вниз/слева направо (правда тут иные регистровые пары используются, и рисуется в буфер),
напиши все параметры буфера, тут не телепаты сидят
и вообще, зачем пересчитываешь адрес в каждой строке?
напиши все параметры буфера, тут не телепаты сидят
и вообще, зачем пересчитываешь адрес в каждой строке?
ну он как и реальный экран - 32х24 атрибута содержит. По окончанию рисования с него просто монолитно лдирится на реальный экран.
что касается второго вопроса, у меня же W H картинки кастомные. Поэтому приходится пересчитывать.
Lethargeek
22.09.2024, 21:43
ну он как и реальный экран - 32х24 атрибута содержит. По окончанию рисования с него просто монолитно лдирится на реальный экран.
ну мало ли, буферы бывают больше экрана, чтобы не считать отдельно обрезку спрайтов
или меньше, если на экране меньше область активная
что касается второго вопроса, у меня же W H картинки кастомные. Поэтому приходится пересчитывать.
почему "приходится"? что мешает сразу к адресу смещение прибавлять?
- - - Добавлено - - -
вообще надо бы тебе освоить трассировку в эмуле каком-нить, например xpeccy
Dart Alver
22.09.2024, 22:56
Есть такая процедурка. С ней всё ок. Тут выводит лишь отдельно взятый атрибут по указанным X|Y
Блин... Привыкай писать значения в шестнадцатиричном формате, быстрее будешь понимать когда ерунду пишешь ))
По поводу
; расчет адреса атрибутов знакоместа в DE, B-вертик.координата, C-гориз.координата
LD A,B
RRCA
RRCA
RRCA
LD L,A
AND 31 ; это #1F но нахрена если там 2 значащих бита всего , AND #03 и всё
OR 88 ; это #58
LD H,A
LD A,L
AND 252 ;это #FC и опять нахрена -> AND #E0
OR C
LD L,A
LD A,(_ATTRC)
LD (HL),A
RET
Нет в исходном состоянии работает конечно, если позиции не выходят за рамки, но всётаки
А теперь следующее
Что-то не то в булевой алгебре AND OR
_SPR_H, _SPR_W - высота/ширина ректангла, соответственно.
***
LD A,D
RRCA
RRCA
RRCA
LD C,A
AND 31 ;опять это #1F
OR 242 ; 61952/256 ; #F2 то есть буфер по адресу #F200 - ну-ну
LD B,A
LD A,C
AND 252 ; и опять #FC
OR E
LD C,A
***
Получается что ты к буферу по некратному адресу пытаешься применить метод адресации экрана, в результате у тебя OR #F2 затирает старший бит позиции Y
- - - Добавлено - - -
Замени OR #F2 на ADD #F2 чтоб прокатило ))
А вообще тебе правильно сказали, из цикла лучше исключить расчет адреса, достаточно сделать один раз, а потом просто смещение добавлять.
а потом просто смещение добавлять.
но оно не константное жи. А обратно пропорционально ширине пикчи.
- - - Добавлено - - -
хотя да. Наверное быстрее вычислить значение вначале
LD HL, offset
LD B, (_SPR_W)
LD A, 32
SUB B
LD (HL), A
Наверное так.
- - - Добавлено - - -
Замени OR #F2 на ADD #F2 чтоб прокатило ))
Таки да. Помогло. Благодарю.
Dart Alver
23.09.2024, 02:53
хотя да. Наверное быстрее вычислить значение вначале
LD HL, offset
LD B, (_SPR_W)
LD A, 32
SUB B
LD (HL), A
Наверное так.
Хмм... Нет такой команды 'LD B, (**)', есть 'LD A,(**)' или 'LD BC,(**)'
И много лишнего, например HL зря приплёл.
можно:
LD A,(_SPR_W)
LD B,A
LD A,32
SUB B
LD (offset),A
но лучше например
LD A,(_SPR_W)
NEG ; A=-A
ADD A,32
LD (offset),A
Оба варианта одинаковы и по тактам и по размеру, но во втором случае портится только регистр A
А можно сохранять позицию перед LDIR.
Например вот вариант изменения твоего кода для примера.
ld hl, SPR_ATTR ;указатель на массив DEFB
; Для начала если расположение ячеек координат и размера идёт друг за другом
; типо так :
;_SPR_X DB ?
;_SPR_Y DB ?
;_SPR_W DB ?
;_SPR_H DB ?
; то можно вместо конструкции
; ld a,(_SPR_Y)
; ld d,a
; ld a,(_SPR_X)
; ld e,a
; ld a,(_SPR_H)
; ld b,a
; поступить проще
ld de,(_SPR_X) ; E=(_SPR_X) , D=(_SPR_Y)
ld bc,(_SPR_W) ; C=(_SPR_W) , B=(_SPR_H)
; а теперь вместо этого
;PUTSPRITES2 push bc
; push de
; LD A,D
; RRCA
; RRCA
; RRCA
; LD C,A
; AND 31
; OR 242 ; 61952/256
; LD B,A
; LD A,C
; AND 252
; OR E
; LD C,A
; ld d,b
; ld e,c
; ld bc,(_SPR_W)
; ld b,0
; ldir
; pop de
; inc d
; pop bc
; djnz PUTSPRITES2
; ret
; сначала найдём адрес в буфере (почти та же процедура) ))
ld a,d
rrca
rrca
rrca
ld d,a
and #E0
or e
ld e,a
ld a,d
and 3
add a,#F2 ; Для буфера в #F200
ld d,a ; в DE - адрес, никаких BC портить не надо
ld a,32 ; ну а вот и наше смещение
sub c ; теперь в A - смещение для строки
1 ; всё начинаем цикл
push bc
ld b,0
ldir
ld c,a ; теперь bc - смещение
ex de,hl
add hl,bc ; переход на новую строку
ex de,hl
pop bc
djnz 1B
ret
Как-то так. Это пример конечно, можно и ещё поколдовать )) Да я и обшибиться мог, не проверял всё-таки ))
И да - код что этот, что изначальный предполагает что спрайт атрибутов целиком помещается в экране,
если вылезет - будет пичалька ))
Lethargeek
23.09.2024, 10:46
Как-то так. Это пример конечно, можно и ещё поколдовать ))
push/pop и ldb в цикле нафиг не нужны, просто c загружать два раза (мб даже из половинок ix в сумме выгодней); счётчик строк в a
ldir/lddr это верное решение, но стек все же лучше.
Ну вот допустим есть у меня процедура переброски с виртуалки на реальный экран.
Как её переделать под стековую?
Ну или на худой конец может цепочкой ldi выгоднее?
VIRT_ATTR_TO_SCR
halt
di
ld bc,768
ld de,REAL_SCREEN
ld hl,MAIN_BUFF ; главный буфер
ldir
ei
RET
Алсо, может есть альтернатива хальту, чтоб верт-синхру корректировала? Или тут только вручную считать такты, да NOP-ы фигачить?
Ну вот допустим есть у меня процедура переброски с виртуалки на реальный экран.
Как её переделать под стековую?
Ну или на худой конец может цепочкой ldi выгоднее?
VIRT_ATTR_TO_SCR
halt
di
ld bc,768
ld de,REAL_SCREEN
ld hl,MAIN_BUFF ; главный буфер
ldir
ei
RET
Алсо, может есть альтернатива хальту, чтоб верт-синхру корректировала? Или тут только вручную считать такты, да NOP-ы фигачить?
тебе зачем через стек?
Bedazzle
01.10.2024, 08:28
Ну или на худой конец может цепочкой ldi выгоднее?
LDI быстрее чем LDIR, обычно по 32 байта перекидывают (компромисс между скоростью и объёмом кода).
Dart Alver
01.10.2024, 11:06
Что лучше стек, ldir/lddr или ldi определяет поставленная задача.
Необходимость и достаточность. Если достаточно скорости ldir , то усложнение кода будет избыточно, если недостаточно, то использование ldi или стека необходимо.
По синхронизации. Halt наиболее простой и удобный способ. Если он по тем или иным причинам не устраивает, то можно например всунуть необходимую процедуру непосредственно в прерывание при im2. Если её нужно запускать только при определённых условиях - например поставить чтото типа семафор.
Flag EQU $+1 : ld a,1 ; сам флаг
or a ; проверка на 0, если 0, то аыполняем
ret nz
inc a ; сбрасываем 0 на 1
ld (Flag),a
; дальше сама процедура
* * *
Что лучше стек, ldir/lddr или ldi определяет поставленная задача.
ну вот конкретно в данном случае стоит задача максимально быстро перебросить линейные 768 байт атрибутов.
Чего-то я с циклом туплю снова. Почему-то цикл бесконечный получается.
VIRT_ATTR_TO_SCR
halt
di
;ld bc,768
ld hl,MAIN_BUFF ; откуда
ld de,REAL_SCREEN ; куда
; ldir
ld bc,48 ; вдвое больше, т.к. djnz и ldi декрементят B
VTSL1
dup 32 ; 32 ldi-шки подряд
ldi
edup
djnz VTSL1
ei
RET
Lethargeek
01.10.2024, 14:13
ну вот конкретно в данном случае стоит задача максимально быстро перебросить линейные 768 байт атрибутов.
Чего-то я с циклом туплю снова. Почему-то цикл бесконечный получается.
VIRT_ATTR_TO_SCR
halt
di
;ld bc,768
ld hl,MAIN_BUFF ; откуда
ld de,REAL_SCREEN ; куда
; ldir
ld bc,48 ; вдвое больше, т.к. djnz и ldi декрементят B
VTSL1
dup 32 ; 32 ldi-шки подряд
ldi
edup
djnz VTSL1
ei
RET
КАЖДЫЙ ldi декрементит BC (а не b)
КАЖДЫЙ ldi декрементит BC (а не b)
А, да. Значит...
ld bc, 7680
Жырновато по проверке цыкла выходит. Да и ощутимого прироста скорости не видно.
Привет всём...
Про стек, там примерно так...
ld sp, ix
pop hl, de, bc, af
exx
ex af, af'
pop hl, de, bc, af
Затем...
ld sp, iy
push af, bc, de, hl
exx
ex af, af'
push af, bc, de, hl
На 16 байт...
И тд...
Процедура такая пошла с игры - Starion...
Можно код посмотреть и найти саму
процедуру...
Про такты - pop и push - 21 такт на 2 байта,
ldi, ldi - 2 по 16 = 32 такта...
Ещё есть такой вариант...
ld sp,
pop hl
ld ( ), hl
Повторить 16 раз...
В таком варианте pop и ld ( ), hl -
26 тактов на 2 байта...
Lethargeek
01.10.2024, 19:49
А, да. Значит...
ld bc, 7680
Жырновато по проверке цыкла выходит. Да и ощутимого прироста скорости не видно.
странное число, ну да ладно; важно другое
во-1, ты переоцениваешь djnz - применимость у него ограничена, и всего на такт быстрее dec+jpnz
то есть можно было счётчик строк держать хотя бы в A и вообще забить на BC
во-2, именно для ldi/ldd есть способ даже быстрее, а именно - проверять флаг p/v
если мануалы читать внимательно, видим, что при BC=0 он меняется, то есть можно
ld bc,TOTAL_BYTES
_NEXT_ROW: ... (тут мб коррекция адресов, если копия не 1:1)
ldi-ldi-ldi-
jp pe,_NEXT_ROW
важно только перед циклом кратное значение BC точно выставить, чтобы не проскочить проверку
- - - Добавлено - - -
еще чем именно ldi/ldd хороши (но не ldir/lddr) - на тормозных фирменных спеках они сами выровняются по тактам юлы и перестанут тормозить
а вот со стековыми перебросками уже не всё так однозначно, на фирме выигрыш может получиться меньше, если вообще
(разумеется, это справедливо, если не успеть завершить все переброски на верхнем бордюре без тормозов)
Заменил лдирки на
ld bc,768
VL1:
dup 32
ldi
edup
jp pe,VL1
Визуально разницы не заметил. Походу так и останусь на старом добром лдире.
Bedazzle
01.10.2024, 22:20
Визуально разницы не заметил.
LDI - 16 тактов / байт
LDIR - 21 такт байт, 16 на последнем
значит учитывая разницу
767 * 5 = 3835 тактов
если брать Пентагон с 71680 в кадре, это около 5%.
Заменил лдирки на
ld bc,768
VL1:
dup 32
ldi
edup
jp pe,VL1
Визуально разницы не заметил. Походу так и останусь на старом добром лдире.
Да всё правильно...
768 байт там и не заметишь разницы...
Вот если пересылать экранами -
до 6912 байт, то разница будет заметна...
Bedazzle
02.10.2024, 07:45
ну вот конкретно в данном случае стоит задача максимально быстро перебросить линейные 768 байт атрибутов.
LD DE, xxx ; 10 тактов
PUSH DE ; 11 тактов
LD DE, yyy
PUSH DE
....
10.5 тактов на байт, полтора килобайта кода если атрибуты не повторяются (иначе можно экономить память и повысив скорость, выкинув часть LD)
LD DE, xxx ; 10 тактов
PUSH DE ; 11 тактов
LD DE, yyy
PUSH DE
....
10.5 тактов на байт, полтора килобайта кода если атрибуты не повторяются (иначе можно экономить память и повысив скорость, выкинув часть LD)
Это не пересылка - это вывод.
туда еще внести эти данные надо.
а изза структуры буфера может быть проблематично
мне где-то встречался вариант с сравнением перед пересылкой
и если число на экране и в буфере совпадало, то оно пропускалось.
Lethargeek
02.10.2024, 13:00
мне где-то встречался вариант с сравнением перед пересылкой
и если число на экране и в буфере совпадало, то оно пропускалось.
танунафиг, это ж лишнее чтение экрана
вот таблица грязных тайлов - другое дело
Как-то так. Это пример конечно, можно и ещё поколдовать )) Да я и обшибиться мог, не проверял всё-таки ))
И да - код что этот, что изначальный предполагает что спрайт атрибутов целиком помещается в экране,
если вылезет - будет пичалька ))
теперь несколько иная задача возникла.
А именно разбить ldir на составные (т.к. планирую сделать зеркальную итерацию атрибутов в строке, и скип оных по ключевому цвету).
Пробую так, но чёто не то. Какая-то кашыца получается в одну строку. Хотя казалось бы, что может пойти не так.
push bc
LD B,(_SPR_W)
ALT_LDIR ld a,(hl)
ld (de),a
inc hl
INC DE
DJNZ ALT_LDIR
; ldir
Тут уже макс. скорость не требуется.
Dart Alver
02.10.2024, 20:03
теперь несколько иная задача возникла.
А именно разбить ldir на составные (т.к. планирую сделать зеркальную итерацию атрибутов в строке, и скип оных по ключевому цвету).
Пробую так, но чёто не то. Какая-то кашыца получается в одну строку. Хотя казалось бы, что может пойти не так.
LD B,(_SPR_W) - нет такой команды в Z80 !!!
В остальном нифига не понял что ты хочешь сделать.
LD B,(_SPR_W) - нет такой команды в Z80 !!!
В остальном нифига не понял что ты хочешь сделать.
Да... опять на те же грабли...
Странно что компилятор не ругается и сглатует за милую душу эту ересь.
Вопрос снят. Терь всё ок.
Bedazzle
02.10.2024, 23:02
Это не пересылка - это вывод.
туда еще внести эти данные надо.
а изза структуры буфера может быть проблематично
А у нас ТЗ очень размытое. Может, нужно просто положить в экран из памяти. :)
Казалось, что всё уже, баZа для движка имеется. Ан нет. Всё никак не отстану.
Вот в том блоке, где мы прибавляем смещение к hl, как мне выполнить проверку, что атрибуты находятся в диапазоне от 0 до 31 ? Чтоб отсекало, а не лезло на след. строку.
сначала найдём адрес в буфере (почти та же процедура) ))
ld a,d
rrca
rrca
rrca
ld d,a
and #E0
or e
ld e,a
ld a,d
and 3
add a,#F2 ; Для буфера в #F200
ld d,a ; в DE - адрес, никаких BC портить не надо
ld a,32 ; ну а вот и наше смещение
sub c ; теперь в A - смещение для строки
1 ; всё начинаем цикл
push bc
ld b,0
ldir
ld c,a ; теперь bc - смещение
ex de,hl
add hl,bc ; переход на новую строку
ex de,hl
pop bc
djnz 1B
ret
Как-то так. Это пример конечно, можно и ещё поколдовать )) Да я и обшибиться мог, не проверял всё-таки ))
И да - код что этот, что изначальный предполагает что спрайт атрибутов целиком помещается в экране,
если вылезет - будет пичалька ))
- - - Добавлено - - -
Прост не хотелось бы переделывать ширину буфера.
- - - Добавлено - - -
Прост не хотелось бы переделывать ширину буфера.
но, видимо, таки придётся...
Стал переделывать шырину буфера (на 40 байт на строку вместо 32-ух)
Заменил в этой строке на ld a,40
ld a,32 ; ну а вот и наше смещение
sub c ; теперь в A - смещение для строки
1 ; всё начинаем цикл
Затем процедура переброски буфера на экран:
VIRT_WIDE_ATTR_TO_SCR
halt
di
ld de,REAL_SCREEN
ld hl,MAIN_BUFF ; главный буфер
; ldir
LD B,24
WIDE_LOOP
push bc
ld bc,32
ldir
ld bc,8 ; 40 ширина буфера минус 32 область реального экрана - остаток
add hl,bc
pop bc
DJNZ WIDE_LOOP
ei
RET
Но почему-то позиция XY атрибутов начинается с косяком. То, что должно быть 0 по X, равняется 32-8.
И вместо отсечения - переход на следующую строку...:v2_dizzy_sleep2:
- - - Добавлено - - -
ааа.. кажется я поооонииил.. пока не уверен наверняка, но по-моему там сорс-дестинейшн адреса блитинга спрайтов нарушены (ибо я их изначально делал под запас буфера с вертикальным скроллом)
Dart Alver
06.10.2024, 20:43
Стал переделывать шырину буфера (на 40 байт на строку вместо 32-ух)
Заменил в этой строке на ld a,40
И это всё что ты заменил ? А то, что старом варианте проги адресация была гвоздями прибита к ширине 32 байта ты учёл ? ))
- - - Добавлено - - -
Вот очень простенький и медленный вариант адресации для 40 байтной ширины буфера.
; адрес в буфере шириной 40 байт E-x , D-y
; 40 не кратен степеням 2-ки
; ADR= Y*40+X = Y*32+Y*8+X
; максимальный Y=23 ; 256/23=11,13...
; в нашем случае можно умножение на 8 использовать байтовое
; а уже дальше придётся переходить на слова
push hl
ld a,d ; Y
ld d,#F2 ; старший байт буфера
add a,a ; *2
add a,a ; *4
add a,a ; *8
ld l,a
ld h,0
add hl,hl ; *16
add hl,hl ; *32
add a,l ; \
ld l,a ; | *32 + *8
jp nc,1F ; |
inc h ; /
1 add hl,de ; +x +буфер
ex de,hl
pop hl
Пытаться оптимизировать дальше влом. ))
Если бы ширина буфера была бы скажем 64 или 128 (кратна степеням 2-ки), то арифметика адресации была бы попроще. ))
Если бы ширина буфера была бы скажем 64 или 128 (кратна степеням 2-ки), то арифметика адресации была бы попроще. ))
Шота оно не пашет у меня...
делать шырину 64... жертвовать впустую 576 байт... не уверен что могу сейчас себе это позволить.
Снова атрибуты.
На сей раз пытаюсь скроллить циклически экран влево
Но получается какая-то муть.
SCROLL_PLANE_L
di
ld hl,22528
ld de,22528-1
ld b,24 ; строки
ld a,(hl); берём первый пиксель
push af
SCROLL_PLANE_L1:
push bc
ld bc,31 ; столбцы
ldir
pop bc
pop af
ld (hl),a; переносим на последний столбец
inc hl ; следующая строка
djnz SCROLL_PLANE_L1
ei
ret
По задумке тут через аккум первый пиксель в строке должен переноситься на последний циклично (в идеале вообще бы через теневые регистры это замутить, чтоб лишний раз не долбиться в стек).
В общем, сыпется оно не так, как задумывалось.
Убери push af / pop af и подыми SCROLL_PLANE_L1: на строку выше.
Тут нумерация строк не делается?
Убери push af / pop af
а... понел. Я чёт подумал, что ldir задевает аккум.
Да, провтыкал метку цикла. Очень невнимательный я Альйоша.
Теперь вот не могу нужный оффсет подобрать меж значениями "ld bc,31 ; столбцы" и "inc hl", чтоб картинку не расколбашувало диагонально.
Наверно так?
SCROLL_PLANE_L
di
ld de,22527 ; начало экрана
ld hl,22527 + 1 ; начало экрана + 1
ld b,24 ; строк
SCROLL_PLANE_L1:
ld a,(de) ; сохраним первый столбец
push bc
ld bc,32 - 1 ; всего столбцов - первый
ldir ; переместим все влево
pop bc
; DE - указатель на последний в текущей строке
; HL - на первый на следующей строке
ld (de),a ; переносим сохранённый первый на последний столбец в строке
inc de ; следующая строка
inc hl ; следующая строка + 1
djnz SCROLL_PLANE_L1
ei
ret
Старайся писать аккуратно. Себе же меньше работы будет! И людЯм приятно.)
Что то LIST этот свернул всё.(
SCROLL_PLANE_L
di
ld de,22527 ; начало экрана
ld hl,22527 + 1 ; начало экрана + 1
ld b,24 ; строк
SCROLL_PLANE_L1:
ld a,(de) ; сохраним первый столбец
push bc
ld bc,32 - 1 ; всего столбцов - первый
ldir ; переместим все влево
pop bc
; DE - указатель на последний в текущей строке
; HL - на первый на следующей строке
ld (de),a ; переносим сохранённый первый на последний столбец в строке
inc de ; следующая строка
inc hl ; следующая строка + 1
djnz SCROLL_PLANE_L1
ei
ret
Bedazzle
31.10.2024, 11:51
По задумке тут через аккум первый пиксель в строке должен переноситься на последний циклично
Так понимаю, по задумке "пиксель" - это всё знакоместо атрибутное? Тогда что-то типа такого (пишу с головы, не тестировал):
ld hl, 22529
ld de, 22528
scroll:
ld a, (de)
DUP 32
ldi
EDUP
ld (de), a
counter:
ld a,24
dec a
ret z
ld (counter+1),a
inc de
inc l
jp scroll
- - - Добавлено - - -
Наверно так?
А зачем di/ei, если стек используется только в штатном режиме?
А зачем di/ei, если стек используется только в штатном режиме?
Понятия не имею - это к АLKO вопросы. Я вообще с Синклером не работал - игрался только.)
Тоже подумал об ldi, если скорость важна.
counter не даёт выигрыша по сравнению с push/pop/djnz.)
Bedazzle
31.10.2024, 18:34
counter не даёт выигрыша по сравнению с push/pop/djnz.)
А так?
ld hl, 22529
ld de, 22528
ld a, 24
scroll:
ex af, af'
ld a, (de)
DUP 32
ldi
EDUP
ld (de), a
ex af, af'
dec a
jp nz, scroll
ret
в данном случае скорость для меня не столь уж и важна, так что можно и без ldi-шек
а разве при di доступ к стеку обрубается? тогда странно как в других подпрограммах пуш попы работают...
- - - Добавлено - - -
да, пиксель = атрибут.
Bedazzle
31.10.2024, 19:11
в данном случае скорость для меня не столь уж и важна, так что можно и без ldi-шек
А что важно? Понятный код? Размер? Конкретные регистры?
а разве при di доступ к стеку обрубается?
DI = disable interrupt, отключает вызов прерывания, которое гадит в стек.
Если с прерываниями обходиться неосторожно, то, например, при отрисовке стеком в буфер можно залезть за границу, и попортить часть программы.
А если рисовать стеком на экран, то можно залезть на пзу, и вылететь неизвестно куда.
Наверно так?
[/CODE]
Старайся писать аккуратно. Себе же меньше работы будет! И людЯм приятно.)
Что то LIST этот свернул всё.(
SCROLL_PLANE_L
di
ld de,22527 ; начало экрана
ld hl,22527 + 1 ; начало экрана + 1
ld b,24 ; строк
SCROLL_PLANE_L1:
ld a,(de) ; сохраним первый столбец
push bc
ld bc,32 - 1 ; всего столбцов - первый
ldir ; переместим все влево
pop bc
; DE - указатель на последний в текущей строке
; HL - на первый на следующей строке
ld (de),a ; переносим сохранённый первый на последний столбец в строке
inc de ; следующая строка
inc hl ; следующая строка + 1
djnz SCROLL_PLANE_L1
ei
ret
Ну я примерно так и делал. Съезжает чёт по краям всё равно.
А что важно? Понятный код? Размер? Конкретные регистры?
Да там построчного LDIR'а хватит вполне. Вот только пристыковать эту цикличность бы.
Ну я примерно так и делал. Съезжает чёт по краям всё равно.
Ты бы идею донёс? Подробно, как для дебилов. Иначе - пас.
Ты бы идею донёс? Подробно, как для дебилов. Иначе - пас.
Есть слой атрибутов. Ну те, что цвет Ink Paper задают. 768 байт, начиная с адреса #5800.
Надо циклически скроллить этот массив. То есть атрибут, вышедший за край левой стороны появляется справа. Наоборот я уже по образу и подобию сделаю. (вообще там надо будет под буфер иной ширины переделывать, тож по образу и подобию, мне главное чтоб наглядно было сразу на экране видно, как атрибуты ведут себя.)
Lethargeek
01.11.2024, 00:47
Есть слой атрибутов. Ну те, что цвет Ink Paper задают. 768 байт, начиная с адреса #5800.
Надо циклически скроллить этот массив. То есть атрибут, вышедший за край левой стороны появляется справа. Наоборот я уже по образу и подобию сделаю. (вообще там надо будет под буфер иной ширины переделывать, тож по образу и подобию, мне главное чтоб наглядно было сразу на экране видно, как атрибуты ведут себя.)
сдвигай сразу весь массив на один байт, хоть даже единственным лдиром; перед этим запомнить надо лишь один байт, потом крайний столбец сдвинешь по вертикали и вставишь этот байт
- - - Добавлено - - -
пример на массиве 4x3
до сдвига:
1 2 3 4
5 6 7 8
9 a b c
запомнили 1
сразу после сдвига:
2 3 4 5
6 7 8 9
a b c c
правый столбец вниз, начав снизу:
2 3 4 5
6 7 8 5
a b c 9
вставили 1:
2 3 4 1
6 7 8 5
a b c 9
Bedazzle
01.11.2024, 00:59
Да там построчного LDIR'а хватит вполне. Вот только пристыковать эту цикличность бы.
Мой пример чем не люб?
Мой пример чем не люб?
Тоже съезжает вверх. :v2_dizzy_tired2:
- - - Добавлено - - -
потом крайний столбец сдвинешь по вертикали и вставишь этот байт
Ибо нужно ещё ето.
- - - Добавлено - - -
https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExbWlxZ2xmY2E4M3MzN2QzYTNzbDI1enp kczZ2M2k2dzViNHB6cXMwaCZlcD12MV9pbnRlcm5hbF9naWZfY nlfaWQmY3Q9Zw/wEF0j9lfdptCsIwcUQ/giphy.gif
Bedazzle
01.11.2024, 09:18
Тоже съезжает вверх. :v2_dizzy_tired2:
Ну, я предупредил, что с головы пишу :)
Вот это проверил:
org $8000
entry:
ld a, 9
ld (22528),a
ld (22528+767),a
starter:
halt
ld hl, 22529-1
ld de, 22528-1
ld a, 24
scroll:
inc hl ; можно заменить на inc l
inc de
ex af, af'
ld a, (de)
DUP 31
ldi
EDUP
ld (de), a
ex af, af'
dec a
jp nz, scroll
jp starter
ret
А так?
Так да. Быстрее этого вряд ли получится.)
Тоже съезжает вверх. :v2_dizzy_tired2:
- - - Добавлено - - -
Ибо нужно ещё ето.
- - - Добавлено - - -
https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExbWlxZ2xmY2E4M3MzN2QzYTNzbDI1enp kczZ2M2k2dzViNHB6cXMwaCZlcD12MV9pbnRlcm5hbF9naWZfY nlfaWQmY3Q9Zw/wEF0j9lfdptCsIwcUQ/giphy.gif
dup 31
ldi
edup
ld (de),a
inc hl inc de
Oleg N. Cher
01.11.2024, 17:49
jerri, удали EmuZWin.exe.manifest, тогда кнопки будут отображаться в винде 10 нормально.
Bedazzle
01.11.2024, 18:15
jerri, удали EmuZWin.exe.manifest
Скорее ALKO
- - - Добавлено - - -
Так да. Быстрее этого вряд ли получится.)
Ну разве что совсем чуточку, и освободим альт рег А:
org $8000
entry:
ld a, 9
ld (22528),a
ld (22528+767),a
starter:
halt
ld hl, 22529
ld de, 22528
scroll:
ld a, (de)
DUP 31
ldi
EDUP
ld (de), a
inc l
inc de
ld a, $5B
cp d
jp nz, scroll
jp starter
ret
Ну разве что совсем чуточку...
Ха! Всегда есть место для совершенства!) +
Bedazzle, спасибо, пашет.
Но я пока не уверен, как там ляжет условие в конце, где ld a, $5B.
У меня буфер 40х24, так что 960 на 256 делится с остатком, и в один байт не укладывается.
Bedazzle
02.11.2024, 10:29
Но я пока не уверен, как там ляжет условие в конце, где ld a, $5B.
У меня буфер 40х24, так что 960 на 256 делится с остатком, и в один байт не укладывается.
Ну, тогда можно вернуться к версии с AF'
Dart Alver
02.11.2024, 22:28
Но я пока не уверен, как там ляжет условие в конце, где ld a, $5B.
У меня буфер 40х24, так что 960 на 256 делится с остатком, и в один байт не укладывается.
А прокручивать ты весь буфер будешь, или только видимую часть ? Насколько помню ты буфер вроде мутил тупо чтоб спрайты обрезать ))
; ...
ld de,Boofer
ld hl,Boofer+1
ld bc,24*31 ; 24*(размер прокручиваемой зоны-1: т.е. количество LDI ),
; т.е. 24*31 для видимой части, 24*39 для всего буфера
loop
ld a,(de)
DUP 31 ; если прокручивается только видимая часть или 'DUP 39' , если весь буфер
ldi
EDUP
ld (de),a
DUP 9 ; если крутится видимая часть или убрать обёртку 'DUP/EDUP' вокруг инков, если весь буфер
inс hl
inc de
EDUP
ld a,b
or c
jp nz,loop
; ...
- - - Добавлено - - -
Пожалуй если прокручивается видимая часть буфера, то лучше пожалуй заменить
DUP 9
inс hl ; 6
inc de ; 6
EDUP ; (6+6)*9 = 108 тактов , 18 байт
на :
push bc ; 11
ld bc,9 ; 10
add hl,bc ; 11
ex de,hl ; 4
add hl,bc ; 11
ex de,hl ; 4
pop bc ; 10 = 61 такт , 9 байт
;
- - - Добавлено - - -
Да так, как флаг p/v кроме ldi никакая команда здесь не меняет,
то можно
ld a,b
or c
jp nz,loop
заменить всего лишь на
jp pe,loop
А прокручивать ты весь буфер будешь, или только видимую часть ? Насколько помню ты буфер вроде мутил тупо чтоб спрайты обрезать ))
Да, весь. Чтоб слой плавно вылазил из-за экрана.
А уж итоговый результат обрезаю, и кидаю на реал-экран.
- - - Добавлено - - -
Ну как на той же сеге мд, реальный экран 320х224, но слои 512х512 (либо 1024х256, в зависимости от режима)
- - - Добавлено - - -
Попробовал код Bedazzle на полноценной пикче в буфере, там чёта несколько рядов пикселей рушится
Должно быть так равномерно
https://sun9-22.userapi.com/impg/a-gphaaSrSoDv9dSfc3ZS7UQD6-URsInOPY-Tw/iwl-lMLDEFE.jpg?size=328x366&quality=96&sign=2c4ffaeac1f7d6af758a2504c1337540&type=album
Но тут в одном участке вот такой бугорок
https://sun9-79.userapi.com/impg/IofpPxJWW6D79TDoBYP9izzY0rPBrw-sgySwqg/Mr3ZbzJY5OE.jpg?size=328x366&quality=96&sign=34aeb2d36215c260240c87aad8a18b21&type=album
- - - Добавлено - - -
Возможно, это я что-то у себя накосячил.
- - - Добавлено - - -
ты буфер вроде мутил тупо чтоб спрайты обрезать
Ещё и микшировать слой прокрутки со спрайтами.
Можно канешн и без буфера, сразу на реал экран фигарить. Но это надо угадать с тактами, прерываниями. Я тут на элементарном спотыкаюсь. Куда уж мне до такой вышки.
Dart Alver
03.11.2024, 16:07
Да, весь. Чтоб слой плавно вылазил из-за экрана.
А уж итоговый результат обрезаю, и кидаю на реал-экран.
Ну тогда прокрутка для буфа 40x24 :
; ...
ld de,Буфер
ld hl,Буфер+1
ld bc,24*39 ; счетчик цикла через ldi = 24*(размер прокручиваемой зоны-1)
l0_
ld a,(de)
DUP 39
ldi
EDUP
ld (de),a
inс hl
inc de
jp pe,l0_
; ...
Вроде так, а там х.з. :)
ld bc,24*39 ; счетчик цикла через ldi = 24*(размер прокручиваемой зоны-1)
А, походу на этом моменте мой фейл. А то я там множил на 40.
ща перепроверю.
SCROLL_PLANE_L
ld hl, PLANE_A
ld de, PLANE_A-1
ld a, 24
scroll:
inc hl ; можно заменить на inc l
inc de
ex af, af'
ld a, (de)
DUP 39
ldi
EDUP
ld (de), a
ex af, af'
dec a
jp nz, scroll
;перенос результата в шырокий буфер
ld bc,960
ld de,MAIN_BUFF;
ld hl, PLANE_A; тулим слой
ldir
ret
А вот как бы его вправо теперь?
В теории предполагаю, что
1.
ld hl, PLANE_A+(40*24)-1
ld de, PLANE_A+(40*24)
2.
DUP 39
ldd
EDUP
3.
dec hl
dec de
Но пока не проверял на практике.
Dart Alver
15.11.2024, 09:55
SCROLL_PLANE_L
ld hl, PLANE_A-1
ld de, PLANE_A
ld a, 24
scroll:
inc hl ; можно заменить на inc l
inc de
...
И это работает ? Точно ? ))
Кстати не факт что можно заменить на inc l ))
А вот как бы его вправо теперь?
Мысль здравая, только с адресацией разобраться поаккуратней.
Bedazzle
15.11.2024, 11:39
Кстати не факт что можно заменить на inc l ))
В задаче, которую решали ранее - было прибито к экранным адресам, там трюк возможен.
Dart Alver
15.11.2024, 21:19
В задаче, которую решали ранее - было прибито к экранным адресам, там трюк возможен.
Согласен, там hl уже переходила возможный инкремент h после выполнения последовательности ldi.
Но не в том дело. У меня складывается очучение что товарищ ALKO нас тонко троллит ;)
Иначе как обьяснить что выложенные процедуры он всегда переделывает в нерабочие, как например сейчас. При таком выборе адресов скрола не будет, будет заполнение :v2_dizzy_punk:
он всегда переделывает в нерабочие,
м?
https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExZWxycjFncXFoZ25vN2VwbWFqbzg4d2E 5Y2sxcXU0Ymd4M2h1eGs4dyZlcD12MV9pbnRlcm5hbF9naWZfY nlfaWQmY3Q9Zw/ziOrSy88vvTcC7vBwb/giphy.gif
Dart Alver
15.11.2024, 23:00
м?
Ну вот, я же говорю троллит. У себя одно пишет, а сюда другое выкладывает :D
ld hl, PLANE_A-1
ld de, PLANE_A
Адрес hl меньше de на 1. При выполнении ldi значение из (hl) заносится в (de), а затем когда hl и de увеличиваются на 1 , hl становится равным бывшему de и в новый (de) следующее ldi заносит опять то же самое значение.
А так как на анимашке совсем другое показываешь, значит там и адреса правильные стоят. ;)
Dart Alver, а хде тут у меня отсебятина?
Ну, буфер у меня шыре реального экрана (40х24).
960 байт маслает чётенько.
https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExcmRiNXhrbjk1cDVyYTZkMWd3bDA4bmh 4amRkc3lwb3lmdHBqd2E2OCZlcD12MV9pbnRlcm5hbF9naWZfY nlfaWQmY3Q9Zw/AxzS6COHek347e3LrT/giphy.gif
- - - Добавлено - - -
Адрес hl меньше de на 1.
Это да...
Это я уже да.. Начал шаманить в правую сторону..
- - - Добавлено - - -
Внёс правки.
https://zx-pk.ru/threads/32014-tema-dlya-vsyakikh-glupykh-voprosov.html?p=1206632&viewfull=1#post1206632
- - - Добавлено - - -
нас тонко троллит
Получилось настолько тонко, что я и сам самозатроллился...
- - - Добавлено - - -
А вот как бы его вправо теперь?
В теории предполагаю, что
1.
ld hl, PLANE_A+(40*24)-1
ld de, PLANE_A+(40*24)
2.
DUP 39
ldd
EDUP
3.
dec hl
dec de
И да. Проверено на практике. Всё ок пашыт в другую сторону.
какой посоветуете ассемблер z80 для командной строки, чтобы умел генерировать intel hex на выходе?
Oleg N. Cher
17.11.2024, 03:48
какой посоветуете ассемблер z80 для командной строки, чтобы умел генерировать intel hex на выходе?sdasz80 из SDCC
Если некритично, что в литералах обязательна решётка # , а хексы пишутся как в Си через 0x
ld hl, #_Klad_idx
ld a, (hl)
add a, #0x0f
81570
sdasz80 из SDCC
Если некритично, что в литералах обязательна решётка # , а хексы пишутся как в Си через 0x
ld hl, #_Klad_idx
ld a, (hl)
add a, #0x0f
а как в нем директивы использовать?
; test.asm
org #0x4000
call #0xcafe
;ld (iy+0),l
;djnz $
ret
$ sdasz80 -o build/test.rel test.asm
test.asm:2: Error: <q> missing or improper operators, terminators, or delimiters
removing build/test.rel
Есть ли еще какие-то варианты, которые классический синтаксис Z80 асма понимают?
sjasm наверно. Но мне нравится м80.) А потом, что мешает перегнать бин в хекс?
Dart Alver
17.11.2024, 12:58
какой посоветуете ассемблер z80 для командной строки, чтобы умел генерировать intel hex на выходе?
Попробуйте упросить Ped7g добавить какой-нибудь SAVEHEX в SjASMplus, а то давно новых фишек не капало ))
Ну или правда конвертер поискать какой.
Oleg N. Cher
17.11.2024, 14:31
а как в нем директивы использовать?https://shop-pdp.net/ashtml/asxs02.htm#org
.org не пробовал. Там назначением адресов по идее линкер занимается.
Есть ли еще какие-то варианты, которые классический синтаксис Z80 асма понимают?Без понятия.
Дело же не хексе, как я понимаю. Основные фишки в самом трансляторе. Умеет ли IRP/IRPC, REPT, ну и макросредства должны быть на уровне. По крайней мере, это важно для удобства. Опять таки, если писать чуток и не изгаляться, то без разницы. Простых ассемблеров просто куча.)
sjasm наверно. Но мне нравится м80.) А потом, что мешает перегнать бин в хекс?
В коде несколько блоков памяти в разных местах. В один bin файл такое не сохранишь.
Пока использую z80asm который в репозитории debian. Но он только в bin сохраняет и кучу файлов ненужных генерирует. Причем нельзя укзать в какую папку их писать, приходится делать вот так:
#!/bin/bash
set -e # Exit on any error
cd "$(dirname "${BASH_SOURCE[0]:-$0}")"
mkdir -p ./build && cd build
z80asm -o jetpac-hack1.bin ../jetpac-hack.asm
z80asm -o jetpac-hack2.bin ../jetpac-hack2.asm
z80asm -o jetpac-hack3.bin ../jetpac-hack3.asm
srec_cat jetpac-hack1.bin -binary -offset 0x7345 \
jetpac-hack2.bin -binary -offset 0x737d \
jetpac-hack3.bin -binary -offset 0x739c \
-o jetpac-hack.hex -Intel
rm jetpac-hack?.bin
Хотя можно было одним файлом это все сразу в hex скомпилить и смещения для сборки hex файла не нужно было бы отдельно задавать - сразу в исходнике из org брать.
С другой стороны undoc инструкции вроде ld (ix+offset),l поддерживает. sdasz80 не понимает, да и с синтаксисом у sdasz80 чтото совсем плохо.
Bedazzle
18.11.2024, 19:00
В коде несколько блоков памяти в разных местах. В один bin файл такое не сохранишь.
Первым исходником сохраняем несколько бинарников.
Второй исходник инклудит эти бинарники в том виде, как нужно, сохраняем в один бинарник.
Тут больше вопрос - сколько эти блоки занимают места (вылетим ли за размер памяти).
Первым исходником сохраняем несколько бинарников.
Допустим первый исходник генерирует 50-100 блоков с разными адресами. Повреждать память между этими блоками нельзя.
Если сохранять это всё в 50-100 бинарников, как предлагаете собирать все это в хекс? Ведь для каждого бинарника нужно распарсить из результатов компиляиции начальный адрес.
При компиляции в hex на выходе просто имеем hex файл который содержи все эти блоки с нужными адресами. Никаких дополнительных телодвижений не нужно.
ZXMAK, попробуйте zmac.) Он может hex на выходе. И у него много разных фишек.
Bedazzle
18.11.2024, 21:01
Допустим первый исходник генерирует 50-100 блоков с разными адресами. Повреждать память между этими блоками нельзя.
Если сохранять это всё в 50-100 бинарников, как предлагаете собирать все это в хекс? Ведь для каждого бинарника нужно распарсить из результатов компиляиции начальный адрес.
При компиляции в hex на выходе просто имеем hex файл который содержи все эти блоки с нужными адресами. Никаких дополнительных телодвижений не нужно.
я про формат хекс не знаю :(
и что значит память между блоками повреждать
я про формат хекс не знаю :(
и что значит память между блоками повреждать
В данном случае я компилировал патч для клавиатуры к jetpac. Пишется org и команды который нужно скомпилить. Далее следующий org и следующие команды. Между концом команд предыдущего org и нового в памяти лежит код, поэтому писать туда ничего нельзя.
Кстати оказалось, jetpac вполне играбельный при использовании нормальных кнопок управления QAOP SPACE. Помню с дефолтными кнопками у меня не хватало терпения даже одну ракету собрать :)
В аттачменте патч в hex файле. Использовать так - ставим точку останова на #6000, загружаем jetpack из tap, когда окажемся на точке останова загружаем hex патч. Можно играть. В аттачменте также уже пропатченый szx снэпшот.
Bedazzle
19.11.2024, 00:25
Использовать так - ставим точку останова на #6000, загружаем jetpack из tap, когда окажемся на точке останова загружаем hex патч.
А, теперь начинает доходить про что речь :) Грубо говоря, файл с наборами покесов.
ZXMAK, попробуйте zmac.) Он может hex на выходе. И у него много разных фишек.
похоже то, что нужно - понимает нормальный синтаксис Z80 асма :)
Правда есть много разных модификаций zmac.
Удивительно, насколько старый и мощный ассемблер и так малоизвестен, был написан еще в 1978 году Bruce Norskog...
Насколько понимаю последняя версия оригинала подчищенная и доработанная тут: http://www.tim-mann.org/trs80/zmac13.zip
Наиболее близкий к этой версии более современный вариант, в нём только мелкие фиксы: https://gitlab.com/jengun/zmac
Мне эта версия понравилась, на ARM64 исполняемый файл всего 80 кБ, недокументированные инструкции понимает, правда hex не умеет писать, но думаю это не проблема поправить. :)
Update: чтото я недосмотрел, оказывается в оригинале есть вывод в hex, опция -h.
Есть еще вот такой вариант: https://github.com/gp48k/zmac
В нем есть много других доработок, но мне она не нравится тем, что в неё напихали кучу всякого мусора вроде записи WAV файлов и т.п.
Я считаю таким фичам не место в ассемблере, WAV и снэпшоты можно сделать отдельными программами.
Есть еще вот такой вариант: https://github.com/gp48k/zmac
В нем есть много других доработок, но мне она не нравится тем, что в неё напихали кучу всякого мусора вроде записи WAV файлов и т.п.
Да, я именно этот имел ввиду, как наиболее свежий. Извиняюсь что сразу не дал ссылку: http://48k.ca/zmac.html).
а поддерживает ли zmac макросы с переменным числом аргументов?
например:
print_code1 macro vcode,v1
ld a,vcode
rst #10
ld a,v1
rst #10
endm
print_code2 macro vcode,v1,v2
ld a,vcode
rst #10
ld a,v1
rst #10
ld a,v2
rst #10
endm
можно это сделать одним макросом print_code, который при наличии v2 будет делать дополнительный вызов rst #10?
M80 это можно делать через ifb/ifnb. Тут этого нет. Можно попробовать через if (!)nul &v2, но не уверен. Как то по каличному.)
M80 это можно делать через ifb/ifnb. Тут этого нет. Можно попробовать через if (!)nul &v2, но не уверен. Как то по каличному.)
попробовал:
print_code macro vcode,v1,v2
ld a,vcode
rst #10
ld a,v1
rst #10
if (!)nul &v2
ld a,v2
rst #10
endif
endm
не работает, при вызове print_code #16,0,0:
test.asm:41: Syntax error
test.asm:41: Balance error
Наверно if !nul &v2. Это я так написал "с ! или без". Или if nul &v2 exitm.
Не поленился, проверил. Работает. Только у меня rst $10 или 10h.
видимо в версии gp48k чтото поменялось с макросами
видимо в версии gp48k чтото поменялось с макросами
Не может быть.) Только # используется для других целей.
1:
2: print_code macro vcode,v1,v2
3: ld a,vcode
4: rst $10
5: ld a,v1
6: rst 10h
7: if !nul &v2
8: ld a,v2
9: rst 10h
10: endif
11: endm
12:
13: - 0000 print_code 1,2,3
13: 0+7 0000 3E01 ld a,1
13: 7+11 0002 D7 rst $10
13: 18+7 0003 3E02 ld a,2
13: 25+11 0005 D7 rst 10h
13: - 0001 if !nul 3
13: 36+7 0006 3E03 ld a,3
13: 43+11 0008 D7 rst 10h
13: endif
13: - 0009 endm
14: ;print_code 1,2,
15: - 0009 print_code 1,2
15: 54+7 0009 3E01 ld a,1
15: 61+11 000B D7 rst $10
15: 72+7 000C 3E02 ld a,2
15: 79+11 000E D7 rst 10h
15: - 0000 if !nul
15: endif
15: - 000F endm
16:
17: - 000F end
Statistics:
3 passes
0 jr promotions
0 symbols
15 bytes
2 macro calls
133 macro bytes
0 invented symbols
Вот код:
; zmac -i -m -h -o build/test-marg.hex -x build/test-marg.lst test-marg.asm
ROM_CLS equ #0DAF
ROM_OPEN_CHANNEL equ #1601 ; a=channel
ROM_PRINT equ #203C ; de=text, bc=length
CHAR_AT equ #16
CHAR_INK equ #10
CHAR_PAPER equ #11
CHAR_BRIGHT equ #13
print_code macro vcode,v1,v2
ld a,vcode
rst #10
ld a,v1
rst #10
if !nul &v2
ld a,v2
rst #10
endif
endm
org #8000
call ROM_CLS
print_code CHAR_AT,0,0
print_code CHAR_PAPER,3
print_code CHAR_BRIGHT,1
ld hl,message
call printf
ret
message:
db 'HELLO WORLD',#00
printf:
ld a,(hl)
or a
ret z
rst #10
inc hl
jr printf
Результат компиляции:
$ ./zmac -i -m -h -o build/test-marg.hex -x build/test-marg.lst test-marg.asm
test-marg.asm:26: Syntax error
test-marg.asm:26: Balance error
test-marg.asm:27: Syntax error
test-marg.asm:27: Syntax error
test-marg.asm:27: Balance error
test-marg.asm:28: Syntax error
test-marg.asm:28: Syntax error
test-marg.asm:28: Balance error
test-marg.asm:26: Undeclared error
test-marg.asm:27: Undeclared error
test-marg.asm:28: Undeclared error
Dart Alver
22.11.2024, 00:30
какой посоветуете ассемблер z80 для командной строки, чтобы умел генерировать intel hex на выходе?
В целях поиздеваться над мозгом, попробовал накалякать мелкую библиотечку с lua функциями для sjasmplus, генерирующую этот тип хекса, если конечно правильно разобрался в формате. :v2_confu:
Пользоваться -> в начало исходника вставить: include IntelHEX.asm
макросом ihexname# имя.hex создать файл для вывода
и макросами ihex# начало_блока,длина запихивать блоки.
Минус - имя файла не понимает кавычек/апострофов - в этом эксперименте мне лень возиться было :rolleyes:
- - - Добавлено - - -
Не делал запись окончания файла. Проглядел и так и не понял нужна она вообще в нашем случае или нет. :v2_conf2:
----------------------------
Добавил запись окончания файла -
макрос без параметров ihexend#
Dart Alver
23.11.2024, 21:08
Немного доработал, причесал (хотя может наоборот), добавил обработку кавычек, растянул запись до максимума (255 байт данных), впихнул запись нулевого расширенного адреса, добавил подобие лицензии (прям как большой :v2_tong: ), малость багов думаю тоже добавил, хотя надеюсь что вру )) .
Теперь думаю а нафига оно то мне было надо ? :v2_confu: Впрочем было интересно немного в lua поковыряться. ;)
v0.1
А я вот удивляюсь. ZXMAK, ну ты ж грамотный мужик, вроде бы.) Неужто сам не в состоянии поиграться с макро средствами этого zmac-а? Или нянька нужна?)
M80, вот вы угадали, я как-раз и полез добавлять, в итоге завис на пару дней, разбирая код. Поняв что это надолго, появилась идея реализовать более чистую реализацию на lex/yacc, в итоге еще день ушел и я увяз в грамматиках. По итогу новые макросы так и не добавил, а время потратил. Впрочем разобрал как zmac работает, реализация честно говоря не очень надежная. Если большой код компилить, то посыпется песок... Нужно переделывать :)
Версия от gp48k еще более закрученная, вначале была мысль портировать из нее лексический анализатор в оригинальную версию, но как оказалось в ней прикручено так много костылей, что даже в лексический анализатор код сразу пишет...
Погуглил альтернативы на lex/yacc, но ничего для Z80 не нашел, есть только обсуждения где пишут что проще код вручную разбирать. И кстати в zmac лексический анализатор вручную написан, lex не используется. Поэтому в нем много костылей и дорабатывать код сложно.
Похожий подход был во встроенном ассемблере первого zxmak, там вообще весь код трансляции инструкции в код вручную написан был. Хотелось бы универсальный ассемблер, нормально переваривающий сложные вложенные макросы и выражения.
Когда то, лет эдак 20 назад, пытался было заменить этот М80 на что то посовременнее. Ну куда это годиться, 1981-го года выпуска, хоть и Microsoft(с), но под CP/M - прям, стыдоба какая то.) Кинулся, было, кучу разных ассемблеров перепробовал... и нифига. То валятся, то одно не нравится, то другое... Правда, исходник был не мал, 36000 строк где то. Ну и макро, типа, IRP/IRPC использовал. В общем, потыкался я и успокоился. Правда, на zmac не наткнулся.( А изделие проработало аж до 2012-го года, хотя оптимистично рассчитывал до 2000-го.)
может кто подскажет исходники z80 ассемблера с лексикой описанной в lex файле, а не вручную в коде написанной?
Странно, что столько ассемблеров для z80 написали, но ни одного lex файла гугл не находит :)
может кто подскажет, нужны примеры для тестирования синтаксического анализатора для z80 ассемблера. Интересуют разнообразные необычные варианты примеров кода, которые должны работать.
Barmaley_m
08.12.2024, 16:20
Погуглил альтернативы на lex/yacc, но ничего для Z80 не нашел, есть только обсуждения где пишут что проще код вручную разбирать. И кстати в zmac лексический анализатор вручную написан, lex не используется. Поэтому в нем много костылей и дорабатывать код сложно.
Попробуй Ragel (http://www.colm.net/open-source/ragel/). Основные его свойства:
1) Похоже на lex, только намного круче
2) Генерирует конечные автоматы с возможностью их визуализации
3) Очень компактный C-код на выходе
4) До yacc не дотягивает, но для задач вроде Z80 ассемблера это не нужно.
Я даже уже начал делать "аналог" M80 на Ragel, но не доделал. Лежит у меня этот проект. Одно могу точно сказать: Ragel - подходящий инструмент для этой задачи.
Читал-читал доки по LUA - ничего не понял. Или старею, или - в Sjasm версия действительно древняя.
Пример из документации Sjasm:
LUA
-- Function reads number from file <fname>, increases it, creates define "BUILD" with the number and saves the number to <fname>.
-- With this function you can control count of compilations.
function increase_build(fname)
local fp
local build
local time
fp = assert(io.open(fname, "rb"))
build = tonumber(fp:read("*all"))
assert(fp:close())
if type(build) == "nil" then
build = 0
end
build = build + 1;
sj.insert_define("BUILD", build)
fp = assert(io.open(fname, "wb"))
assert(fp:write( build ))
assert(fp:flush())
assert(fp:close())
end
-- Before using you must create empty file "build.txt"!
increase_build("build.txt")
-- Creates define "TIME" with current time
sj.insert_define("TIME", '"' .. os.date("%d-%m-%Y %H:%M:%S") .. '"')
ENDLUA
Как сделать, чтобы в файл писался не только номер билда, но и содержимое TIME?
А если содержимое BUILD и TIME будет при компиляции писаться еще и в код, через DB, например - будет вообще идеально.
Как сделать, чтобы в файл писался не только номер билда, но и содержимое TIME?
А если содержимое BUILD и TIME будет при компиляции писаться еще и в код, через DB, например - будет вообще идеально.
Да вроде обе хотелки в лоб реализуются
LUA
-- Function reads number from file <fname>, increases it, creates define "BUILD" with the number and saves the number to <fname>.
-- With this function you can control count of compilations.
function increase_build(fname)
local fp
local build
local time
fp = assert(io.open(fname, "rb"))
build = tonumber(fp:read("*number"))
assert(fp:close())
if type(build) == "nil" then
build = 0
end
build = build + 1;
sj.insert_define("BUILD", '"' .. build .. '"')
fp = assert(io.open(fname, "wb"))
assert(fp:write( build, " ", os.date("%d-%m-%Y %H:%M:%S") ))
assert(fp:flush())
assert(fp:close())
end
-- Before using you must create empty file "build.txt"!
increase_build("build.txt")
-- Creates define "TIME" with current time
sj.insert_define("TIME", '"' .. os.date("%d-%m-%Y %H:%M:%S") .. '"')
ENDLUA
DEVICE ZXSPECTRUM48
ORG #5B00
DB TIME
DB BUILD
SAVEBIN "output.bin", #5B00, $-#5B00
Bedazzle
16.02.2025, 23:49
Как сделать, чтобы в файл писался не только номер билда, но и содержимое TIME?
А если содержимое BUILD и TIME будет при компиляции писаться еще и в код, через DB, например - будет вообще идеально.
Я без луа делал из батника вывод в файл, который дальше инклудился:
set dt=%DATE:~8,2%-%DATE:~3,2%-%DATE:~0,2%_%TIME:~0,2%:%TIME:~3,2%
set dt=%dt: =0%
set dt=%dt:_= %
set version=%DATE:~6,4%.%DATE:~3,2%.%DATE:~0,2%
echo | set /p="%dt%" > __build.bin
Тайльнемер
14.09.2025, 16:24
В какой порт спектрума (младший байт адреса порта) можно безопасно, без побочных эффектов, записать любое значение при любом старшем байте адреса?
Другими словами, при каком n команда `out (n), a` гарантированно ничего не сделает на всех моделях спектрумов и клонов?
Если за все модели поручиться нельзя, то хотя бы на большинстве.
В какой порт спектрума (младший байт адреса порта) можно безопасно, без побочных эффектов, записать любое значение при любом старшем байте адреса?
Другими словами, при каком n команда `out (n), a` гарантированно ничего не сделает на всех моделях спектрумов и клонов?
Если за все модели поручиться нельзя, то хотя бы на большинстве.
FF
Spectramine
14.09.2025, 19:30
FF
На таймексах порт FF - управление экранными режимами. А также в некоторых реализациях ULAplus.
На таймексах порт FF - управление экранными режимами. А также в некоторых реализациях ULAplus.
есть кандидат лучше?
ну так то и в трдос есть ff.
все позанимали, что не напрямую то неполной дешифрацией
Spectramine
14.09.2025, 20:00
Может #F7?
за интерфейсом 1, тоже нормально, шансы с таймексом примерно одинаковые) с улой плюс конечно печальный выбор, тоже наверное от безысходности взяли.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot