Вход

Просмотр полной версии : Тема для всяких глупых вопросов



Страницы : 1 [2] 3

Spectramine
30.01.2022, 19:56
Стабильность вполне возможно и есть, но эти флаги работают несколько по другому. Не так, как до сих пор думали. У Патрика есть уже на этот счет гипотеза
Если бы стабильность была, в тесте с картинкой тоже была бы стабильность, там же одни и те же команды выполняются. А раз точки мигают (причем нерегулярно), значит стабильности нет.

- - - Добавлено - - -


Реверс Z80 еще никто не сделал?
Я не в курсе.

reddie
30.01.2022, 20:23
А раз точки мигают (причем нерегулярно), значит стабильности нет.
Да вы не на экран смотрите, а сверяйте кусок памяти. Там, может, вообще ничего в реальности не меняется, а телевизор кажет баги пикселей, попавших под "горячую руку" мусорной шины данных процессора. Точнее, тракта видеовыборки.

- - - Добавлено - - -

Полистал тему, увидел скрины с тестами. В них, надеюсь, реально проверяются значения из памяти, так что глюки экрана отпадают =)

Raydac
30.01.2022, 20:29
а что там за тест на команды 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

Titus
30.01.2022, 23:27
Все схемы лежат тут плюс реализация под 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' ?
самозатирание, полагаю

Titus
31.01.2022, 01:05
ну чето он такое из силикона зареверсил и даже прогу написал так что я думаю не имитация а вполне себе:
Может частично зареверсил, а остальное додумал?
Просто в доках на версию 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.

Raydac
31.01.2022, 01:25
самозатирание, полагаю
а где то описывалось правильное поведение при таком? а то смотрю таже FUSE выдает ошибку на тесте

Spectramine
31.01.2022, 16:56
а где то описывалось правильное поведение при таком? а то смотрю таже FUSE выдает ошибку на тесте

https://spectrumcomputing.co.uk/forums/viewtopic.php?f=23&t=6102

zebest
31.01.2022, 23:57
Да вы не на экран смотрите, а сверяйте кусок памяти.
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 как оба проходят?

zebest
01.02.2022, 01:28
INIR->NOP' и INDR->NOP' из z80full и z80ccf
На реале?? Эти без проблем проходят.
У меня проблемы только с опкодами, которые порты проверяют.

Lethargeek
01.02.2022, 02:03
У меня проблемы только с опкодами, которые порты проверяют.
в смысле "проверяют"?

zebest
01.02.2022, 08:16
INIR->NOP' и INDR->NOP' из z80ccf
ну да, эта группа тестов 095-103 у меня вся не проходит, им нужно четко определенные порты читать, на Профи они видимо по-своему реализованы, тут не повезло.
https://s.micp.ru/5QE1z.jpghttps://s.micp.ru/duT01.jpg

goodboy
01.02.2022, 10:32
группа тестов 095-103 у меня вся не проходит, им нужно четко определенные порты читать, на Профи они видимо по-своему реализованы
там виноват 6ой бит в порту #FE
(набери в бейсике print in 254 и посмотри результаты на фирме и своём реале)

Lethargeek
01.02.2022, 10:36
там виноват 6ой бит в порту #FE
шестой бит это магнитофон, и он походу проверяется перед тестом, лишь бы не менялся в процессе
а тут пятый занулён почему-то, что-нибудь на профи висит на нём?

goodboy
01.02.2022, 10:41
а тут пятый занулён почему-то
на фирме из порта читается #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

zebest
01.02.2022, 11:14
на фирме из порта читается #BF, получается шестой бит = 0
тут вопрос, с чего начинать нумеровать, с нулевого бита, или он первый.
Да, косяк с портами какой то есть
https://s.micp.ru/Zf45n.jpg
Ноль наглухо залипший на порту #DFFE в шестом бите (или все же в пятом?)) , но линия физически при этом шестая :)
Попробую вечером отпаять 6-ю линию от клавы, оставлю 5ть стандартных, посмотрим с какой стороны останется.

reddie
01.02.2022, 12:12
Попробую вечером отпаять 6-ю линию от клавы, оставлю 5ть стандартных
Так с клавы же пять линий идет на плату, что там на шестую подвешено? Биты 0-4 - входные данные с полурядов, они в порядке.

zebest
01.02.2022, 12:26
Ну это же Профи-к. У него расширенная клавиатура и есть 6 линия.

reddie
01.02.2022, 12:33
У него расширенная клавиатура и есть 6 линия
Ясно. Но это сможет использовать только специально "обученный" софт, стандартный про такое ни сном, ни духом.
А порт #FE там выше на скрине - это результат общего чтения вида XOR A: IN A,(#FE) ? Линия действительно залипшая...

goodboy
01.02.2022, 12:47
это сможет использовать только специально "обученный" софт
судя по описанию
"В драйвере клавиатуры CP/M для Профи используется дополнительный бит порта клавиатуры,
который здесь обозначен как d6 (6-ой бит во внутреннем тесте клавиатуры Профи)

Lethargeek
01.02.2022, 15:51
"В драйвере клавиатуры CP/M для Профи используется дополнительный бит порта клавиатуры,
который здесь обозначен как d6 (6-ой бит во внутреннем тесте клавиатуры Профи)
ну уж линии ШД испокон нумеровали с нуля, ну как так

goodboy
01.02.2022, 16:12
вот ещё

спустя столько лет тут выяснил, что в платах версии 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 при нажатой. Ну по идее, по крайней мре, может, создатели Профи пошли своим путем.

zebest
01.02.2022, 19:31
https://s.micp.ru/g59Ff.jpg
Отпаял доп.линию. Мда. Значит с матрицей не сильно повезло :))
Ну и ладно. Сейчас тест запущу.
https://s.micp.ru/kx5h9.jpg
Сейчас не самый устойчивый в плане флагов проц установлен, но как видно 102 и 103 - OK

Lethargeek
01.02.2022, 20:04
Ну и ладно. Сейчас тест запущу.
какой конкретно тест? именно только full и ccf интересны
почему-то ауты засбоили?? или в прошлый раз другой камень был?
хотелось бы сперва увидеть всё же результаты более стабильного
прежде чем кипишить опять на спектрумкомпутинге)

reddie
07.03.2022, 10:06
Не совсем по программированию, но пусть будет тут.
Подключаю, значит, в Unreal образы дисков (TRD). Указываю в конфиге (Unreal.ini) путь в подкаталог, имена файлов. Задал образы для A: и B: - все работает.
Произвожу изменения, т.е. форматирование или запись файлов внутри эмулятора. При закрытии эмуля (либо попытке вручную из меню перезаписать образ) выдается ошибка: Error while selecting file. Code is 0x00003002
Чего ему не нравится?

Evgeny Muchkin
07.03.2022, 11:24
reddie, мож, версия анрила глючная какая?

reddie
07.03.2022, 12:34
мож, версия анрила глючная какая?
Да не наблюдалось, вроде до этого образы, открываемые в самом эмуле по F3, сохранялись.
Только по F3 всегда диск А: почему-то загружается, даже если текущий дисковод другой. Остальные либо через ini, либо вручную через меню Beta128
Пока решил проблему, разместив образы в главном каталоге (с эмулем). Загрузку из подпапок он понимает, но записывать в них не хочет.

0xDEAD
13.06.2022, 20:56
Глупый вопрос: а как замутить что-то наподобие автоверсии при сборке проекта, ну или при коммите на гитхаб? Где-то хранить версию программы, и чтобы она автоинкрементировалась при сборке, или при каком-либо другом событии? Конкретно - VSCode+DeZog, а так, в принципе, без разницы. Интересно, или это вообще возможно, если сам IDE не представляет такой возможности. Не знаю... средствами LUA, скриптами какими-то, командами препроцессора, или ещё чем-нибудь?

AlexG
13.06.2022, 22:35
если локально (без систем контроля версий) - батниками перед компиляцией создавать нужный файл с нужным содержимом.
если с системой контроля версий (насколь я помню - но ни разу не пользовался) там есть "ключевые слова" которые обновляются при "коммите/чекауте". как то так.
ИМХО.

0xDEAD
14.06.2022, 15:11
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

janvier
02.09.2022, 19:24
Вопрос про организацию задержки с помощью 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

SfS
02.09.2022, 19:38
А на реале или на эмуле?

goodboy
02.09.2022, 20:19
из SOS почти всегда просто зависание происходит.
где эта программа размещается ?
адрес стека ?
как вызывается из бейсика ?

janvier
02.09.2022, 22:35
На эмуляторах Fuse и Unreal. На реальном уст-ве не проверял, там все разобрано. (

- - - Добавлено - - -

Адрес E000h, вызывается стандартно RANDOMIZE USR 4096*14 (адрес не могу запомнить надолго :) ). Стек не отслеживал, делал ресет, потом загрузка бинарного файла с "ленты", потом запуск.

Если интересно, могу tap файл выслать.

Black Cat / Era CG
02.09.2022, 22:38
LD B, 10
BLINK:
PUSH BCПуш если поставить перед меткой?

- - - Добавлено - - -

поменять строчки местами.

janvier
02.09.2022, 22:52
В этом случае программа будет не правильно работать, стек используется для хранения оставшегося кол-ва миганий.

goodboy
02.09.2022, 22:52
Если интересно, могу tap файл выслать.
можно и просто прикрепить к сообщению

janvier
02.09.2022, 23:04
Хорошо, прикладываю
77745

goodboy
03.09.2022, 00:08
вызывается стандартно RANDOMIZE USR 4096*14 (адрес не могу запомнить надолго )
будешь смеяться, но специфика ZXбейсика такова что твоя конструкция вызывает подпрограмму по адресу 4096.
как вариант используй randomize usr (4096*14)

janvier
03.09.2022, 01:13
будешь смеяться, но специфика ZXбейсика такова что твоя конструкция вызывает подпрограмму по адресу 4096.
как вариант используй randomize usr (4096*14)

:) Спасибо, все работает сейчас.

SfS
03.09.2022, 06:19
будешь смеяться, но специфика ZXбейсика такова что твоя конструкция вызывает подпрограмму по адресу 4096.
как вариант используй randomize usr (4096*14)

Это как?! А можно пояснить почему?

- - - Добавлено - - -

Я просто сроду не вызывал usr с вычисляемым выражением.

Sandro
03.09.2022, 06:29
Потому, что по внутренней логике USR -- это функция, а у вызова функции приоритет выше, чем у любой другой операции. Поэтому без скобок это будет исполнено как RANDOMIZE ((USR(4096)) * 14).
Если расставить все подразумевающиеся скобки.

SfS
03.09.2022, 07:43
Понял
Спасибо

Black Cat / Era CG
03.09.2022, 21:34
Будет взят BC вроде, умножен на 14 и брошен на SEED) Вроде так.

zebest
24.09.2022, 18:05
Простейшая сферическая программа, три с половиной строки:

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 ?
Это лечится или сойдет и так?

Reobne
24.09.2022, 18:21
zebest, Бейсик часть вроде нормальная. Надо кодовую часть смотреть. Не портит ли память 5B00..5BFF? Не щёлкает-ли портом 7FFD? Второе маловероятнее.

zebest
25.09.2022, 13:46
Бейсик часть вроде нормальная. Надо кодовую часть смотреть.
Да, Бейсик нормальный. Похоже при запуске из basic128 портится адрес возврата в него же. В кодовой части даже подпрограмму нашел, после которой падает, но на этом и все, не по сеньке шапка это исправить. Да и особо не надо. Это так, еще один из разряда нюансов и особенностей различных моделей.

SAVC
11.12.2022, 06:07
Не могу вспомнить название программы под винду, редактор спековского асма, позволяет просматривать код в несколько столбцов текста на экране, следующих один за другим, мега удобная весчь! прога называлась как-то типа ZX ASM STUDIO или что-то вроде того. Яндекс мне не помог.. :(

len04ka
08.01.2023, 01:43
уже спрашивала на другом форуме, но пока не определилась

Племянник интересуется темой компьютеров, процессоров. Постоянно смотрит ролики на ютуб, пытается что-то паять. Я бы хотела, что бы он начал с исторических азов. Мы обсуждали и он хочет собрать компьютер своими руками. Я обещала помочь спаять (у меня есть опыт пайки плат на десяток дип микросхем, но правда оживляла их не я :-)

Пожалуйста, посоветуй модель самого простого одноплатного компьютера с минимальным количеством деталей и доделок. Знакомый предлагал платы Ленинград или РК86. Мы посмотрели и понимаем что такое пока очень сложно.
Совместимость и возможность компьютера не важны. Главное, подключение клавиатуры и вывод на экранчик или монитор, пусть даже текстовый или черно-белый. Ну и что бы был Бейсик или ассемблер, ведь наверно ему будет интересно не только спаять, но и что-то поделать, что бы захотеть большее развиваться.

Еще важно без ПЛИС и пр. новодельщины. Что бы на микросхемах и процессоре дип 2,54мм и с уже разработанной или что лучше может купить уже готовую плату. Микросхемы и детали найдем как-нибудь (есть откуда :-) ).

Заранее всем благодарна за рекомендации.

newart
08.01.2023, 02:49
уже спрашивала на другом форуме, но пока не определилась

Племянник интересуется темой компьютеров, процессоров. Постоянно смотрит ролики на ютуб, пытается что-то паять. Я бы хотела, что бы он начал с исторических азов. Мы обсуждали и он хочет собрать компьютер своими руками. Я обещала помочь спаять (у меня есть опыт пайки плат на десяток дип микросхем, но правда оживляла их не я :-)

Пожалуйста, посоветуй модель самого простого одноплатного компьютера с минимальным количеством деталей и доделок. Знакомый предлагал платы Ленинград или РК86. Мы посмотрели и понимаем что такое пока очень сложно.
Совместимость и возможность компьютера не важны. Главное, подключение клавиатуры и вывод на экранчик или монитор, пусть даже текстовый или черно-белый. Ну и что бы был Бейсик или ассемблер, ведь наверно ему будет интересно не только спаять, но и что-то поделать, что бы захотеть большее развиваться.

Еще важно без ПЛИС и пр. новодельщины. Что бы на микросхемах и процессоре дип 2,54мм и с уже разработанной или что лучше может купить уже готовую плату. Микросхемы и детали найдем как-нибудь (есть откуда :-) ).

Заранее всем благодарна за рекомендации.
Ленинград оптимальный вариант. Их в 90-е чуть ли не с 10 лет паяли и запускали ребята.
Если что есть чат в телеграме по Ленинграду, уверен что завсегдатаи помогут пройти по всем шагам, от закупки комплектующих до сборки и наладки.
Как вариант можно попробовать схему LUT216, микросхем там меньше и наладка вроде бы не требуется, но паять БМК сложнее, да и дохнут они от любого чиха.

- - - Добавлено - - -


[SPOILER=offtopic]

Еще важно без ПЛИС и пр. новодельщины. Что бы на микросхемах и процессоре дип 2,54мм и с уже разработанной или что лучше может купить уже готовую плату. Микросхемы и детали найдем как-нибудь (есть откуда :-) ).

Заранее всем благодарна за рекомендации.

У меня была мысль сделать обновленную версию Ленинграда, для вот таких современников. Но немного доработанную с модульной структурой, что бы как лего можно было новые возможности добавлять, от SD карты до звукового чипа и пал кодера.

len04ka
09.01.2023, 14:28
Кто то пишет что Ленинград не так и просто запустить. Да и 40 микросхем мы точно не осилим. Нам ведь не нужно на нем играть.

andrews
09.01.2023, 15:07
Без "новодельщины" не получится мало микросхем. Посмотрите тему про Sizif-512. Там всего одна "легкая" Alter-а. Что-то можно на плату и не ставить( правда наверное встроенное ПО придется менять под это). Можно с автором наверное пообщаться на эту тему как сделать вариант "лайт"

Если просто попрограммировать - возьмите эмулятор.

Если просто попрограммировать железный z80 - подключите сам чип z80 к Arduino, или к чему-то подобному( в интернете есть несколько подобных решений).

В принципе в этому случае...
Вам к десктопу или ноутбуку нужен только преобразователь usb в параллельные входы/выходы и соответствующий софт. Запитать z80 сможете через usb, тактировать через один из выходов. Если цель не игры запускать для развития очень интересный проект и устройство получите всего из нескольких микросхем. Можно просто микроконтроллер с USB на борту для этого приспособить. Но тогда это будет ближе к варианту подключения к Arduino. Скорость выполнения реальную наверное не получите, хотя если через USB3.x...
Зато на память и на экраны ограничений никаких не будет! :) и племянник после успешной реализации такого проекта станет супер проектировщиком. А Вам паять будет легко. Может даже что-то заработаете на таком девайсе. Потому что точно так можно любой ретро- CPU подключить и диагностику микросхем почти любых (особенно которые без jtag) делать.

newart
09.01.2023, 18:18
Кто то пишет что Ленинград не так и просто запустить. Да и 40 микросхем мы точно не осилим. Нам ведь не нужно на нем играть.

Скажите, а в чем разница спаять один раз 10 микросхем, или 40 за 4 подхода? (вечера)
Запустить помогут ребя в упомянутом чате, такой тех поддержки как там, вы ни по одному компьютеру больше не получите.

- - - Добавлено - - -

Вот спектрум с минимумом микросхем и все еще на советской элементной базе:

https://pbs.twimg.com/media/DW6EzrbX0AEyvfQ.jpg

ZXFanat
09.01.2023, 20:58
уже спрашивала на другом форуме, но пока не определилась

Племянник интересуется темой компьютеров, процессоров. Постоянно смотрит ролики на ютуб, пытается что-то паять. Я бы хотела, что бы он начал с исторических азов. Мы обсуждали и он хочет собрать компьютер своими руками. Я обещала помочь спаять (у меня есть опыт пайки плат на десяток дип микросхем, но правда оживляла их не я :-)

Пожалуйста, посоветуй модель самого простого одноплатного компьютера с минимальным количеством деталей и доделок. Знакомый предлагал платы Ленинград или РК86. Мы посмотрели и понимаем что такое пока очень сложно.
Совместимость и возможность компьютера не важны. Главное, подключение клавиатуры и вывод на экранчик или монитор, пусть даже текстовый или черно-белый. Ну и что бы был Бейсик или ассемблер, ведь наверно ему будет интересно не только спаять, но и что-то поделать, что бы захотеть большее развиваться.

Еще важно без ПЛИС и пр. новодельщины. Что бы на микросхемах и процессоре дип 2,54мм и с уже разработанной или что лучше может купить уже готовую плату. Микросхемы и детали найдем как-нибудь (есть откуда :-) ).

Заранее всем благодарна за рекомендации.
Человеческий совет. Купите, на том же "Ozon"-е наборы-конструкторы "Ленинград-1" или "Pentagon-128". В сборке неприхотливы. Если не "заладился", то всегда сможете на форуме прочитать советы по исправлению ошибок пайки и советы по наладке. А удовольствие от сборки получите точно на 100%.

andrews
09.01.2023, 21:54
Ага! 7399р и 18424р...однако!

r3d
09.01.2023, 22:47
https://zx-pk.com/forum/viewtopic.php?f=7&t=790

len04ka
09.01.2023, 23:22
Вот спектрум с минимумом микросхем и все еще на советской элементной базе:
где?

ZXFanat
10.01.2023, 01:25
Ага! 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'ки. Для начала не пойдут, но потом возможно будет интересны для знакомства с процессорами разной архитектуры.

newart
10.01.2023, 19:45
Что-то типа Аюша-Z80 (https://zx-pk.ru/threads/29372-ayusha-z80-sr-m-sovmestimyj-kompyuter.html)? На него вроде даже платы разводили.

Есть ещё компы на минималках на разных процах от Ewgeny7, но они никак не документированы, паяны МГТФом и содержат GAL'ки. Для начала не пойдут, но потом возможно будет интересны для знакомства с процессорами разной архитектуры.

Так похоже человек ничего изучать не хочет?.. А хочет просто спаять.
Таким образом можно смотреть на ардуино с DIP чипом.

zebest
20.05.2023, 21:00
Хоть и не по программированию, но вопрос довольно глупый :))
можно ли по ссылке на аттач найти темуу, где я это скачал??
https://zx-pk.ru/attachment.php?attachmentid=77437&d=1655015490
ну или кто автор сего теста, если точнее

LW
20.05.2023, 21:13
наверное как-то можно
https://zx-pk.ru/threads/25139-contended-memory-i-prochie-tormoza-spektrumov.html?p=1155302&viewfull=1#post1155302

zebest
20.05.2023, 22:34
нее, мне не дано было найти))
Все верно, этот тест. У него обнаружилась интересная особенность, а испанцу как всегда автора подавай.
Спасибо!

LW
20.05.2023, 22:49
если искать по номеру вложения, то результаты поиска будет не так сложно отсеять вручную
https://zx-pk.ru/attachment.php?attachmentid=77437&d=1655015490

Арсений
22.06.2023, 19:04
Подскажите пожалуйста. Есть программа на бейсике, есть загрузчик, загрузочный экран, компилятор tobos-fp и скомпилированная из Wham музыка. Загружаю заставку, сам тобос по адресу 53100, скомпилированную бейсик-программу по адресу 40000, музыку по адресу 50000, запускаю музыку с адреса 50000, по нажатию клавиши запускаю программу с адреса 40000. И после уже музыку когда работает скомпилированная тобосом программа запустить уже никак нельзя? Зависает и сбрасывается. Или есть способы?

Enigmatic
12.10.2023, 19:53
Такой вопрос.
Если я сохраняю басик файл в тр-дос, например "10 PRINT 'hello' " , то при его запуске из тр-дос по какому адресу обращается компьютер, чтобы запустить эту сохраненную программу?

goodboy
12.10.2023, 20:07
начало программы на бейсике берётся из переменной (PROGS)
а запуск зависит от указанного номера строки для старта

Reobne
13.10.2023, 12:21
Когда сохраняешь, пиши:
SAVE "hello" LINE 10
и будет стартовать с 10-й

NEO SPECTRUMAN
14.10.2023, 22:58
а фотошоп можот отображать больше 8 бит на компоненту дизерингом при редактировании с зумом и без?

Grand
17.10.2023, 07:48
Загружаю заставку, сам тобос по адресу 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
да "на глаз" подобрано скорее всего (чтоб гасился не быстро и не медленно)

M80
20.10.2023, 13:21
но почему именно #1800... Быдлокод потому что.(

0xDEAD
03.11.2023, 19:17
В советских клонах есть какие-то особенности реализации 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.
А в классике вроде вообще по умолчанию этого порта нет - дополнительно ставится.

0xDEAD
03.11.2023, 22:11
Джойстика или мыши. В программе опрашивается порт 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 есть особенности с ними. А в программе обработчик выдран из книги "как написать игру..."

0xDEAD
04.11.2023, 10:52
Программа в IM1 работает.

Deadly
15.11.2023, 00:39
Как научится доделывать свои проекты?

SfS
17.11.2023, 11:57
Как научится доделывать свои проекты?

Берёшь и доделываешь!)

Spectramine
17.11.2023, 14:51
Как научится доделывать свои проекты?

Не светить промежуточные результаты, это сильно демотивирует в доделывании. Если уже светил, поудалять. Определиться с тем, какой твой интерес в доделывании - по приколу, поставить галочку "завершено", и т.п. Вспомнить, что было мотивацией для начала работы над проектом. Очень мотивирует, если сам хочешь пользоваться тем, что делаешь (для игры - сам хочешь играть в неё).
Ну и ничего страшного нет в том, чтобы забить на недоделанный проект, если он делался ради интереса, а интереса больше нет.

UncleDim
17.11.2023, 18:47
Кто такой генерал Фэйлур и почему он читает мои данные??

Связка срам-цплд, читаем из ОЗУ по одному адресу и тут же, следующим тактом, записываем по другому, нигде не запоминая результат чтения(т.е. на ёмкостях монтажа только). Кто-нить пробовал?

AlexG
17.11.2023, 21:09
"Нужны приключения ? Они есть у меня..." (с)

UncleDim
17.11.2023, 22:45
приключения ?
да, частота 20-30 Мгц

AlexG
20.11.2023, 10:15
Забудьте про чтение-запись на "лету". сиё крайне не технологично.

Enigmatic
24.11.2023, 16:28
Почему на Спектруме не реализовали яркость чёрного цвета?

Raydac
24.11.2023, 17:06
Почему на Спектруме не реализовали яркость чёрного цвета?
формально бит яркости для сброшенных битов цвета в атрибуте может отражаться неочень качественным цапом и можно бывало увидеть черные и менее черные знакоместа на телеках

Conan
24.11.2023, 22:57
Почему на Спектруме не реализовали яркость чёрного цвета?Это позволяет отображать яркие и неяркие цвета на однородном черном фоне. В противном случае это было бы невозможно, поскольку флаг Bright общий для Inc и Paper в байте атрибутов знакоместа.

UncleDim
25.11.2023, 02:22
крайне не технологично
"зато дешево, надежно и практично" (с))
т.е. опробовал, работает
(а пуркуа бы и не па, работает же в синклерах "порт FF" на частотах, меньших на порядок..)

- - - Добавлено - - -


не реализовали яркость чёрного цвета?
"есть мнение", что слишком много тогда комбинаций вполне разборчивых на цветном, но не очень на черно-белом тв.

Conan
25.11.2023, 16:41
"есть мнение", что слишком много тогда комбинаций вполне разборчивых на цветном, но не очень на черно-белом тв.дело не большом числе комбинаций, а в механизме формирования яркостного сигнала. В оригинальном ZX Spectrum 48 разница между уровнями яркого и обычного цветов отличается в зависимости от цвета. Для черного цвета (если отключить блокировку яркости для него) эта разница действительно минимальна. Но даже в этом случае она заметна на экране телевизора (как цветневого, так и черно-белого).

Для совместимости с Ceefax (телетекстом) Ричард Альтвассер ориентировался на их палитру при разработке видеоввода ZX Spectrum. Можно посмотреть на картинку телетекста (или прочитать описание стандарта):

http://teletext.mb21.co.uk/gallery/ceefax/bbctest_animated.gif

Для формирования телетекста использовались максимально яркие цвета на темном фоне. Если бы ZX Spectrum имел "яркий-черный», то цвет поля экрана отличался бы от черного цвета рамки (бордюра).

goodboy
25.11.2023, 18:28
вот пример использования 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)

В верхней части адреса начала знакоместа, а в нижней конкретного пикселя. (нет только значения ячейки пикселя и маски пикселя)

AndTorp
25.02.2024, 04:48
Какой может быть алгоритм изменения (увеличения) скорости стрелки при управлении от клавиатуры?

LW
25.02.2024, 05:22
один из вариантов



подбираются индивидуально
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

kas1e
15.04.2024, 07:45
А подскажите , нет ли хака для Soldier of Fortune, что бы пользуясь геймпадами на кемстон интерфейса, перемапить прыжок не на "вверх" а на любую другую кнопку ? Или по факту с кемпстоном это анрил и только 1 кнопка ?

Xela
16.04.2024, 15:07
пользуясь геймпадами на кемстон интерфейса, перемапить прыжок
все игры с поддержкой "расширенного" кемпстона (https://vtrd.in/search.php?search=%23kemp8bit) - где-то прыжок отдельно, где-то отдельная кнопка за доп.действие отвечает.



перемапить прыжок не на "вверх" а на любую другую кнопку
в Next'e есть "Keyjoy" - там можно на любую кнопку джойстика "перемапить" любую кнопку клавиатуры (но не кемпстона).

Black Cat / Era CG
16.04.2024, 17:24
На Эволюшен тоже сегапад можно на клаву ремапить.

Xela
16.04.2024, 19:47
Я не знаю, есть ли у kas1e Ева, но Некст у него точно есть. Поэтому только про него и написал.

Black Cat / Era CG
16.04.2024, 23:00
А. Ок :)

kas1e
17.04.2024, 05:33
все игры с поддержкой "расширенного" кемпстона (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. Эвы нет да, только некст

Xela
17.04.2024, 13:01
Есть в целом путь какой-то как сделать
в 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, но пока хз как выбрать кнопки джоя
замапить можно только клавиши. "кнопки" кемпстона замапить никак.

kas1e
17.04.2024, 13:32
Так я не про мап джоя на клаву, я про ремап джоевского. Пусть будет что угодно - синлайр, курсор и тд. Мне главное сделать чтобы вверх на джойстике в солдате фортуны стал любой кнопкой джоя, а кемпстон или синклайр, или что еще пох. Или такое не возможно с джоем и только ремапится на клаивиатуру ? Мне ремап нужен именно на джой, не на клаву.

Т.е. поменять вверх на вторую кнопку джоя, пох как (кроме паяния конечно)

Xela
17.04.2024, 13:44
Или такое не возможно с джоем и только ремапится на клаивиатуру ? Мне ремап нужен именно на джой, не на клаву.
ну блин... я ж картинку даже приложил - в данном примере при нажатии вверх на джойстике (реальном джойстике подключенном в левый порт Next'а) - будет "нажиматься" W, в солдате фортуны нужно переопределить клавиши так же, что б W отвечала за вверх или прыжок.
можно замапить на кнопку вверх цифру 9 (вверх на Sinclair Joy 2) или цифру 4 (вверх на Sinclair Joy 1), и все остальные кнопки тоже замапить на соответствующие Sinclair Joy 1 или 2. Кемпстон только нельзя в таком режиме привязать к кнопкам реального джойстика.

kas1e
17.04.2024, 13:50
Я когда в меню ремапа (как у тебя на картинке), жму "е" для лефта, у меня никакого изменения когда джоем жму верхнизлевоправо нет. Только 3 кнопки реагируют, и то не основные. Джой 8бит дуо, в левом порту (в левом если смотреть на некст)

Xela
17.04.2024, 14:36
Джой 8бит дуо, в левом порту (в левом если смотреть на некст)

https://youtu.be/GojC8e9qhi4

- - - Добавлено - - -


Только 3 кнопки реагируют, и то не основные
https://i.postimg.cc/8kq24hZQ/keyjoy2.gif (https://postimages.org/)
вот тут точно keyjoy выбран???

если там default или kempston, то на кнопки XYZ на джойстике будут вызывать "нажатие" соответствующих клавиш клавиатуры.

- - - Добавлено - - -


жму "е" для лефта, у меня никакого изменения когда джоем жму верхнизлевоправо нет.

#$%! ты что пытаешься джойстиком там что-то выбрать? )))

kas1e
17.04.2024, 15:57
#$%! ты что пытаешься джойстиком там что-то выбрать? )))

Да, была надежда что это классический ремап - нажал кнопку на джое - отобразилось. А оно походу спектрумовское совсем - просто буквами на клаве менять их мап на джой, а не джоем самим жать :)

Xela
17.04.2024, 16:00
просто буквами на клаве менять их мап на джой, а не джоем самим жать
да так как-то удобнее как раз - сразу выбрал кнопку нужную, чем кнопками влево-вправо выбирать нужную клавишу из 40 возможных.

kas1e
17.04.2024, 18:12
да так как-то удобнее как раз - сразу выбрал кнопку нужную, чем кнопками влево-вправо выбирать нужную клавишу из 40 возможных.

Я сначала просто думал что это классическое переназначение кнопок джоя , а это просто копия клавовых кнопок на джой, т.е. под каждую игру надо смотреть какие там кнопки будут, и уже делать. Но теперь крутяк солдата фортуны играть где кнопка огонь и кнопка прыгать , клево!

ВитГо
19.08.2024, 16:49
вопрос новичка: а есть под виндовс какая нить ide для программирования на ассемблере под z80 ?
что нить в одном флаконе ?

0xDEAD
19.08.2024, 19:17
Для z80 или для ZX-Spectrum?

Deadly
19.08.2024, 20:48
вопрос новичка: а есть под виндовс какая нить ide для программирования на ассемблере под z80 ?
что нить в одном флаконе ?

https://youtu.be/Gerd209yR-M?si=SwmJPvhZv7Rm613s

ВитГо
20.08.2024, 01:57
Для 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

Deadly
20.08.2024, 21:02
вообще не понял к чему это видео... какой то процесс с середины, что там настроено, как, не понятно совершенно.... меня интересует ide для написание программ на ассемблере, с поддержкой множества символов, навигации по файлам, подсветкой кода, компиляцией в бинарники для последующей прошивки

p.s. блин, неужели ничего на подобие моего ArmAsmEdit для Z80 нет ? то есть все чуть ли не в блокноте (FARe) редактируют код ?! афигеть :-(

плохому тонцору, пол не ровный...

- - - Добавлено - - -

если ты в этом видео ничего не подчеркнул, то могу только посочувствовать.

- - - Добавлено - - -

пользуйся блокнотом, желательно бумажным и навигируйся - листая его

Andrey_PROFI
23.08.2024, 12:48
Deadly, Вы правы !)) Но нынешним танцорам подавай сразу яхту, видете ли)) Их не смущает, что Z80 старше их самих))

ВитГо
27.08.2024, 17:43
Deadly, Вы правы !)) Но нынешним танцорам подавай сразу яхту, видете ли)) Их не смущает, что Z80 старше их самих))

вы друг друга стоите. один выкладывает видео с середины установленной уже среды - то есть бесполезнее некуда,
второй флудит...
по делу же оба написали меньше чем ничего...
у вас в жизни проблемы с чсв что ли ?

jerri
28.08.2024, 10:01
вы друг друга стоите. один выкладывает видео с середины установленной уже среды - то есть бесполезнее некуда,
второй флудит...
по делу же оба написали меньше чем ничего...
у вас в жизни проблемы с чсв что ли ?

В вашем посту есть реклама ArmASmEdit и непонятный пассаж про блокноты

Не нравится VS code
возьмите TommyGun (https://github.com/tonyt73/TommyGun)

Shiny
28.08.2024, 13:15
у ZX Spin есть ассемблер и отладчик.

Deadly
29.08.2024, 01:04
один выкладывает видео с середины установленной уже среды - то есть бесполезнее некуда
Мне записать видео как устанавливать плагины в vc?

- - - Добавлено - - -

А ещё есть описание к видео

- - - Добавлено - - -

Открываешь браузер, вбиваешь, что такое visual code, как навигироваться в visual code, читаешь книгу как написать программы на ассемблере.потом спрашиваешь, что такое компиляторы z80, наткнешься о чем я говорю о саджасме, далее пару кликов и ты находишь документацию по саджасму. параллельно правой ногой ты навигируешься в интернете и левым глазом читаешь что такое ide vc и как там плагины ставятся. далее в поисковике ide вхерачиваешь z80 и мля получаешь список доступных плагинов, далее проходишься по всем им читаешь мануалы, вдупляешь что тебе нужно и мля ты уже начинаешь задавать правильные вопросы, а потом уже посмотри видяху. И тупые вопросы отподут.

- - - Добавлено - - -

Но вообще советую пользоваться тетрадкой, как правило компилятор не выдает ошибок и все чин чинарем, а после второй стопки уже и незачем разбираться, лучше я полежу пузо почему. Зачем напрягать мозг и т.п.

- - - Добавлено - - -

Но ты главное не унываей, при должном рвении и сноровке, ты сможешь задать в 21 веке правильные вопросы поисковику и разобраться как работать с иде и как там что.

ZXMAK
01.09.2024, 20:13
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 заставляет задуматься, в некоторых местах оно даже лучше, если б не ненастраиваемый нечитабельный вывод ))

Shiny
03.09.2024, 07:59
Мне хватает EmEditor+ужасм, который приспособлен к редактору.Ну и Spectaculator вслед(:

topcom
06.09.2024, 15:07
здравствуйте

подскажите самый простой способ подключить FDD 3.5" к Sintez-2

нужен контроллер , какой именно попроще? ВГ93 дефицит как понимаю. нет ли сейчас схем на PICах или типа того ?

Dart Alver
07.09.2024, 00:42
Что не понравилось в этом редакторе - отсутствие настройки цвета вывода компилятора. На моей теме это вообще вырвиглаз, хотя все остальные вкладки смотрятся отлично.
Упс. Оказывается это я болван. Настраивается через Инструменты/Файлы настроек/geany.css ))

ALKO
16.09.2024, 22:16
Вопрос ультра-нуба.
Копирую 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

ALKO
18.09.2024, 16:49
окей. С этим разобрался.
Теперь хочу сделать атрибутный скроллер сверху вниз.
Если бы нужно было снизу вверх сделать, достаточно

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 в обратном порядке.

Shiny
18.09.2024, 17:02
ldir/lddr это верное решение, но стек все же лучше.

Lethargeek
18.09.2024, 20:40
ldir/lddr это верное решение, но стек все же лучше.
ну тут атрибуты же, их немного; а если lddr развернуть в ldd-ldd (благо размер заранее известен) - тогда всё успеет перебросить еще на бордере

ALKO
18.09.2024, 21:30
ещë один мега-дыбильный вопрос.

ld a,0
loop1:
inc a

jp po, loop0
; код программы, если флаг чëтный
loop0:

;продолжение кода
jp loop1

По задумке чëт/нечет должен переключаться при каждом инкременте, и соответственно перескакивать по условию. Но не перескакивает. Оно только для константных чисел работает что ли? Ну, типа, явное присвоение ld a, 228, например? Как мне щëлкать флаг в цикле, шоба пульсировало подобно мультивибратору?

M80
18.09.2024, 22:28
По задумке чëт/нечет должен переключаться при каждом инкременте
Это хитрый флаг. Согласно букварю, при инкременте: 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

ALKO
22.09.2024, 01:55
что-то аномалия какая-то у меня в процедуре закраски массивом атрибутов в области ректангла.


Есть такая процедурка. С ней всё ок. Тут выводит лишь отдельно взятый атрибут по указанным 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 сверху вниз/слева направо (правда тут иные регистровые пары используются, и рисуется в буфер),
напиши все параметры буфера, тут не телепаты сидят
и вообще, зачем пересчитываешь адрес в каждой строке?

ALKO
22.09.2024, 09:01
напиши все параметры буфера, тут не телепаты сидят
и вообще, зачем пересчитываешь адрес в каждой строке?

ну он как и реальный экран - 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 чтоб прокатило ))
А вообще тебе правильно сказали, из цикла лучше исключить расчет адреса, достаточно сделать один раз, а потом просто смещение добавлять.

ALKO
23.09.2024, 00:34
а потом просто смещение добавлять.

но оно не константное жи. А обратно пропорционально ширине пикчи.

- - - Добавлено - - -

хотя да. Наверное быстрее вычислить значение вначале

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

ALKO
01.10.2024, 01:02
ldir/lddr это верное решение, но стек все же лучше.

Ну вот допустим есть у меня процедура переброски с виртуалки на реальный экран.
Как её переделать под стековую?
Ну или на худой конец может цепочкой ldi выгоднее?

VIRT_ATTR_TO_SCR
halt
di
ld bc,768
ld de,REAL_SCREEN
ld hl,MAIN_BUFF ; главный буфер
ldir
ei
RET

Алсо, может есть альтернатива хальту, чтоб верт-синхру корректировала? Или тут только вручную считать такты, да NOP-ы фигачить?

jerri
01.10.2024, 07:55
Ну вот допустим есть у меня процедура переброски с виртуалки на реальный экран.
Как её переделать под стековую?
Ну или на худой конец может цепочкой 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
; дальше сама процедура
* * *

ALKO
01.10.2024, 14:00
Что лучше стек, 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)

ALKO
01.10.2024, 14:25
КАЖДЫЙ ldi декрементит BC (а не b)

А, да. Значит...
ld bc, 7680

Жырновато по проверке цыкла выходит. Да и ощутимого прироста скорости не видно.

Stl75
01.10.2024, 15:09
Привет всём...
Про стек, там примерно так...

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) - на тормозных фирменных спеках они сами выровняются по тактам юлы и перестанут тормозить
а вот со стековыми перебросками уже не всё так однозначно, на фирме выигрыш может получиться меньше, если вообще
(разумеется, это справедливо, если не успеть завершить все переброски на верхнем бордюре без тормозов)

ALKO
01.10.2024, 20:46
Заменил лдирки на


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%.

Stl75
02.10.2024, 05:53
Заменил лдирки на


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)

jerri
02.10.2024, 12:26
LD DE, xxx ; 10 тактов
PUSH DE ; 11 тактов
LD DE, yyy
PUSH DE
....

10.5 тактов на байт, полтора килобайта кода если атрибуты не повторяются (иначе можно экономить память и повысив скорость, выкинув часть LD)

Это не пересылка - это вывод.
туда еще внести эти данные надо.
а изза структуры буфера может быть проблематично

goodboy
02.10.2024, 12:35
мне где-то встречался вариант с сравнением перед пересылкой
и если число на экране и в буфере совпадало, то оно пропускалось.

Lethargeek
02.10.2024, 13:00
мне где-то встречался вариант с сравнением перед пересылкой
и если число на экране и в буфере совпадало, то оно пропускалось.
танунафиг, это ж лишнее чтение экрана
вот таблица грязных тайлов - другое дело

ALKO
02.10.2024, 15:56
Как-то так. Это пример конечно, можно и ещё поколдовать )) Да я и обшибиться мог, не проверял всё-таки ))
И да - код что этот, что изначальный предполагает что спрайт атрибутов целиком помещается в экране,
если вылезет - будет пичалька ))

теперь несколько иная задача возникла.
А именно разбить 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 !!!

В остальном нифига не понял что ты хочешь сделать.

ALKO
02.10.2024, 22:07
LD B,(_SPR_W) - нет такой команды в Z80 !!!

В остальном нифига не понял что ты хочешь сделать.

Да... опять на те же грабли...
Странно что компилятор не ругается и сглатует за милую душу эту ересь.

Вопрос снят. Терь всё ок.

Bedazzle
02.10.2024, 23:02
Это не пересылка - это вывод.
туда еще внести эти данные надо.
а изза структуры буфера может быть проблематично

А у нас ТЗ очень размытое. Может, нужно просто положить в экран из памяти. :)

ALKO
05.10.2024, 17:35
Казалось, что всё уже, ба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
Как-то так. Это пример конечно, можно и ещё поколдовать )) Да я и обшибиться мог, не проверял всё-таки ))
И да - код что этот, что изначальный предполагает что спрайт атрибутов целиком помещается в экране,
если вылезет - будет пичалька ))

- - - Добавлено - - -

Прост не хотелось бы переделывать ширину буфера.

- - - Добавлено - - -


Прост не хотелось бы переделывать ширину буфера.
но, видимо, таки придётся...

ALKO
06.10.2024, 19:20
Стал переделывать шырину буфера (на 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-ки), то арифметика адресации была бы попроще. ))

ALKO
06.10.2024, 23:00
Если бы ширина буфера была бы скажем 64 или 128 (кратна степеням 2-ки), то арифметика адресации была бы попроще. ))

Шота оно не пашет у меня...
делать шырину 64... жертвовать впустую 576 байт... не уверен что могу сейчас себе это позволить.

ALKO
30.10.2024, 02:39
Снова атрибуты.

На сей раз пытаюсь скроллить циклически экран влево
Но получается какая-то муть.

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

По задумке тут через аккум первый пиксель в строке должен переноситься на последний циклично (в идеале вообще бы через теневые регистры это замутить, чтоб лишний раз не долбиться в стек).
В общем, сыпется оно не так, как задумывалось.

M80
30.10.2024, 03:40
Убери push af / pop af и подыми SCROLL_PLANE_L1: на строку выше.
Тут нумерация строк не делается?

ALKO
30.10.2024, 23:46
Убери push af / pop af
а... понел. Я чёт подумал, что ldir задевает аккум.

Да, провтыкал метку цикла. Очень невнимательный я Альйоша.
Теперь вот не могу нужный оффсет подобрать меж значениями "ld bc,31 ; столбцы" и "inc hl", чтоб картинку не расколбашувало диагонально.

M80
31.10.2024, 11:39
Наверно так?

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, если стек используется только в штатном режиме?

M80
31.10.2024, 11:59
А зачем 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

ALKO
31.10.2024, 18:42
в данном случае скорость для меня не столь уж и важна, так что можно и без ldi-шек
а разве при di доступ к стеку обрубается? тогда странно как в других подпрограммах пуш попы работают...

- - - Добавлено - - -

да, пиксель = атрибут.

Bedazzle
31.10.2024, 19:11
в данном случае скорость для меня не столь уж и важна, так что можно и без ldi-шек

А что важно? Понятный код? Размер? Конкретные регистры?


а разве при di доступ к стеку обрубается?

DI = disable interrupt, отключает вызов прерывания, которое гадит в стек.
Если с прерываниями обходиться неосторожно, то, например, при отрисовке стеком в буфер можно залезть за границу, и попортить часть программы.
А если рисовать стеком на экран, то можно залезть на пзу, и вылететь неизвестно куда.

ALKO
31.10.2024, 23:05
Наверно так?

[/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'а хватит вполне. Вот только пристыковать эту цикличность бы.

M80
31.10.2024, 23:36
Ну я примерно так и делал. Съезжает чёт по краям всё равно.

Ты бы идею донёс? Подробно, как для дебилов. Иначе - пас.

ALKO
01.11.2024, 00:25
Ты бы идею донёс? Подробно, как для дебилов. Иначе - пас.

Есть слой атрибутов. Ну те, что цвет 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'а хватит вполне. Вот только пристыковать эту цикличность бы.

Мой пример чем не люб?

ALKO
01.11.2024, 01:52
Мой пример чем не люб?
Тоже съезжает вверх. :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

M80
01.11.2024, 12:15
А так?

Так да. Быстрее этого вряд ли получится.)

jerri
01.11.2024, 14:07
Тоже съезжает вверх. :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

M80
01.11.2024, 18:21
Ну разве что совсем чуточку...

Ха! Всегда есть место для совершенства!) +

ALKO
02.11.2024, 02:59
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

ALKO
03.11.2024, 13:36
А прокручивать ты весь буфер будешь, или только видимую часть ? Насколько помню ты буфер вроде мутил тупо чтоб спрайты обрезать ))
Да, весь. Чтоб слой плавно вылазил из-за экрана.
А уж итоговый результат обрезаю, и кидаю на реал-экран.

- - - Добавлено - - -

Ну как на той же сеге мд, реальный экран 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_

; ...


Вроде так, а там х.з. :)

ALKO
03.11.2024, 16:12
ld bc,24*39 ; счетчик цикла через ldi = 24*(размер прокручиваемой зоны-1)
А, походу на этом моменте мой фейл. А то я там множил на 40.
ща перепроверю.

ALKO
14.11.2024, 22:09
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:

ALKO
15.11.2024, 22:08
он всегда переделывает в нерабочие,
м?
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 заносит опять то же самое значение.
А так как на анимашке совсем другое показываешь, значит там и адреса правильные стоят. ;)

ALKO
16.11.2024, 14:41
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

И да. Проверено на практике. Всё ок пашыт в другую сторону.

ZXMAK
16.11.2024, 20:07
какой посоветуете ассемблер 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

ZXMAK
17.11.2024, 07:20
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 асма понимают?

M80
17.11.2024, 11:55
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 асма понимают?Без понятия.

M80
17.11.2024, 15:51
Дело же не хексе, как я понимаю. Основные фишки в самом трансляторе. Умеет ли IRP/IRPC, REPT, ну и макросредства должны быть на уровне. По крайней мере, это важно для удобства. Опять таки, если писать чуток и не изгаляться, то без разницы. Простых ассемблеров просто куча.)

ZXMAK
18.11.2024, 18:53
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 файл такое не сохранишь.

Первым исходником сохраняем несколько бинарников.
Второй исходник инклудит эти бинарники в том виде, как нужно, сохраняем в один бинарник.

Тут больше вопрос - сколько эти блоки занимают места (вылетим ли за размер памяти).

ZXMAK
18.11.2024, 19:22
Первым исходником сохраняем несколько бинарников.


Допустим первый исходник генерирует 50-100 блоков с разными адресами. Повреждать память между этими блоками нельзя.
Если сохранять это всё в 50-100 бинарников, как предлагаете собирать все это в хекс? Ведь для каждого бинарника нужно распарсить из результатов компиляиции начальный адрес.

При компиляции в hex на выходе просто имеем hex файл который содержи все эти блоки с нужными адресами. Никаких дополнительных телодвижений не нужно.

M80
18.11.2024, 21:00
ZXMAK, попробуйте zmac.) Он может hex на выходе. И у него много разных фишек.

Bedazzle
18.11.2024, 21:01
Допустим первый исходник генерирует 50-100 блоков с разными адресами. Повреждать память между этими блоками нельзя.
Если сохранять это всё в 50-100 бинарников, как предлагаете собирать все это в хекс? Ведь для каждого бинарника нужно распарсить из результатов компиляиции начальный адрес.

При компиляции в hex на выходе просто имеем hex файл который содержи все эти блоки с нужными адресами. Никаких дополнительных телодвижений не нужно.

я про формат хекс не знаю :(
и что значит память между блоками повреждать

ZXMAK
18.11.2024, 22:11
я про формат хекс не знаю :(
и что значит память между блоками повреждать

В данном случае я компилировал патч для клавиатуры к jetpac. Пишется org и команды который нужно скомпилить. Далее следующий org и следующие команды. Между концом команд предыдущего org и нового в памяти лежит код, поэтому писать туда ничего нельзя.

Кстати оказалось, jetpac вполне играбельный при использовании нормальных кнопок управления QAOP SPACE. Помню с дефолтными кнопками у меня не хватало терпения даже одну ракету собрать :)

В аттачменте патч в hex файле. Использовать так - ставим точку останова на #6000, загружаем jetpack из tap, когда окажемся на точке останова загружаем hex патч. Можно играть. В аттачменте также уже пропатченый szx снэпшот.

Bedazzle
19.11.2024, 00:25
Использовать так - ставим точку останова на #6000, загружаем jetpack из tap, когда окажемся на точке останова загружаем hex патч.

А, теперь начинает доходить про что речь :) Грубо говоря, файл с наборами покесов.

ZXMAK
20.11.2024, 12:36
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 и снэпшоты можно сделать отдельными программами.

M80
20.11.2024, 13:03
Есть еще вот такой вариант: https://github.com/gp48k/zmac
В нем есть много других доработок, но мне она не нравится тем, что в неё напихали кучу всякого мусора вроде записи WAV файлов и т.п.

Да, я именно этот имел ввиду, как наиболее свежий. Извиняюсь что сразу не дал ссылку: http://48k.ca/zmac.html).

ZXMAK
20.11.2024, 16:42
а поддерживает ли 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
20.11.2024, 17:24
M80 это можно делать через ifb/ifnb. Тут этого нет. Можно попробовать через if (!)nul &v2, но не уверен. Как то по каличному.)

ZXMAK
20.11.2024, 17:50
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

M80
20.11.2024, 18:03
Наверно if !nul &v2. Это я так написал "с ! или без". Или if nul &v2 exitm.
Не поленился, проверил. Работает. Только у меня rst $10 или 10h.

ZXMAK
20.11.2024, 19:55
видимо в версии gp48k чтото поменялось с макросами

M80
21.11.2024, 08:46
видимо в версии 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

ZXMAK
21.11.2024, 12:43
Вот код:


; 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

M80
24.11.2024, 09:49
А я вот удивляюсь. ZXMAK, ну ты ж грамотный мужик, вроде бы.) Неужто сам не в состоянии поиграться с макро средствами этого zmac-а? Или нянька нужна?)

ZXMAK
24.11.2024, 19:28
M80, вот вы угадали, я как-раз и полез добавлять, в итоге завис на пару дней, разбирая код. Поняв что это надолго, появилась идея реализовать более чистую реализацию на lex/yacc, в итоге еще день ушел и я увяз в грамматиках. По итогу новые макросы так и не добавил, а время потратил. Впрочем разобрал как zmac работает, реализация честно говоря не очень надежная. Если большой код компилить, то посыпется песок... Нужно переделывать :)

Версия от gp48k еще более закрученная, вначале была мысль портировать из нее лексический анализатор в оригинальную версию, но как оказалось в ней прикручено так много костылей, что даже в лексический анализатор код сразу пишет...

Погуглил альтернативы на lex/yacc, но ничего для Z80 не нашел, есть только обсуждения где пишут что проще код вручную разбирать. И кстати в zmac лексический анализатор вручную написан, lex не используется. Поэтому в нем много костылей и дорабатывать код сложно.

Похожий подход был во встроенном ассемблере первого zxmak, там вообще весь код трансляции инструкции в код вручную написан был. Хотелось бы универсальный ассемблер, нормально переваривающий сложные вложенные макросы и выражения.

M80
25.11.2024, 09:30
Когда то, лет эдак 20 назад, пытался было заменить этот М80 на что то посовременнее. Ну куда это годиться, 1981-го года выпуска, хоть и Microsoft(с), но под CP/M - прям, стыдоба какая то.) Кинулся, было, кучу разных ассемблеров перепробовал... и нифига. То валятся, то одно не нравится, то другое... Правда, исходник был не мал, 36000 строк где то. Ну и макро, типа, IRP/IRPC использовал. В общем, потыкался я и успокоился. Правда, на zmac не наткнулся.( А изделие проработало аж до 2012-го года, хотя оптимистично рассчитывал до 2000-го.)

ZXMAK
25.11.2024, 23:45
может кто подскажет исходники z80 ассемблера с лексикой описанной в lex файле, а не вручную в коде написанной?

Странно, что столько ассемблеров для z80 написали, но ни одного lex файла гугл не находит :)

ZXMAK
02.12.2024, 09:08
может кто подскажет, нужны примеры для тестирования синтаксического анализатора для 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 - подходящий инструмент для этой задачи.

0xDEAD
16.02.2025, 20:27
Читал-читал доки по 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, например - будет вообще идеально.

Eltaron
16.02.2025, 21:48
Как сделать, чтобы в файл писался не только номер билда, но и содержимое 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` гарантированно ничего не сделает на всех моделях спектрумов и клонов?
Если за все модели поручиться нельзя, то хотя бы на большинстве.

krt17
14.09.2025, 16:30
В какой порт спектрума (младший байт адреса порта) можно безопасно, без побочных эффектов, записать любое значение при любом старшем байте адреса?

Другими словами, при каком n команда `out (n), a` гарантированно ничего не сделает на всех моделях спектрумов и клонов?
Если за все модели поручиться нельзя, то хотя бы на большинстве.

FF

Spectramine
14.09.2025, 19:30
FF

На таймексах порт FF - управление экранными режимами. А также в некоторых реализациях ULAplus.

krt17
14.09.2025, 19:55
На таймексах порт FF - управление экранными режимами. А также в некоторых реализациях ULAplus.

есть кандидат лучше?
ну так то и в трдос есть ff.
все позанимали, что не напрямую то неполной дешифрацией

Spectramine
14.09.2025, 20:00
Может #F7?

krt17
14.09.2025, 20:03
за интерфейсом 1, тоже нормально, шансы с таймексом примерно одинаковые) с улой плюс конечно печальный выбор, тоже наверное от безысходности взяли.