Вход

Просмотр полной версии : Бейсик-помощь



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

ZX_NOVOSIB
08.05.2018, 11:40
goodboy, +257 к чему?

269+257=526?
или
269-257=12?

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


Навстречу переменным бейсика, вниз растет стек. Так, что в сухом остатке, получается меньше.
Ну вот, так и знал, что всё сложно :)
А как всё-таки вычислить всё это? Я думал, что бац и вот я высчитал 269, а оказалось какие-то буфера тр-доса, стеки, космоса чёрные дыры :v2_wacko: Должна же быть какая-то нормальная формула, чтобы всё это наконец вычислить с точностью до байта.

null_device
08.05.2018, 11:44
+257 к чему?

Буфер куда пихаются данные при работе с TR-DOS. Текст программы, уезжает вверх, на это значение в процессе и возвращается после окончания.
ЕМНИП, об этом написано в книжке "...для пользователей и программистов".

ZX_NOVOSIB
08.05.2018, 11:57
Буфер куда пихаются данные при работе с TR-DOS. Текст программы, уезжает вверх, на это значение в процессе и возвращается после окончания.
Как всё запущено...
Ну в общем, если программа более 12 байт, то нельзя делать мой CLEAR 24136, пока не закончены обращения к тр-досу. Но а после загрузки сжатого хрумом блока куда-нибудь повыше, можно сделать CLEAR 24136, распаковать блок, и вот тогда 269 байт в моём распоряжении? Ах да, там ещё стек надвигается, надо понять насколько именно он надвигается и отнять это число от 269. Только вот как это понять? :D

Разгадка где-то близко...

goodboy
08.05.2018, 11:58
Заходите в TR-DOS и даете команду LIST, например.
лучше CAT, для LIST ещё доп.место выделяется

ZX_NOVOSIB
08.05.2018, 12:05
Делаете CLEAR (сколько вам надо).
Заходите в TR-DOS и даете команду LIST, например. Выходите из TR-DOS.
Набираете PRINT 65536-USR 7962. Получаете число свободной памяти для "маневров", в байтах

лучше CAT, для LIST ещё доп.место выделяется
Out of Ram сказал мне тр-дос на попытку CAT )) После CLEAR 24136

goodboy
08.05.2018, 12:07
Out of Ram сказал мне тр-дос на попытку CAT )) После CLEAR 24136
ну вот и всё. места явно нехватает.
параметры твоего кодового блока ?

ZX_NOVOSIB
08.05.2018, 12:33
ну вот и всё. места явно нехватает.
Нехватало бы, если бы я этот свой блок грузил несжатым в 24137-65532,
но я ж его сожму хрумом, и загружу с адреса 30000 например. А потом сделаю CLEAR 24136, и распакую в 24137-65532. К тр-досу то я больше не буду обращаться. Но мне интересно, сколько байт я смогу потратить на бейсик-загрузчик.

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


Делаете CLEAR (сколько вам надо).
Заходите в TR-DOS и даете команду LIST, например. Выходите из TR-DOS.
Набираете PRINT 65536-USR 7962. Получаете число свободной памяти для "маневров", в байтах.
Так как в моём случае, трдос пишет мне out of ram, то я решил просто зайти в трдос и по-быстрому выйти, беспалева, в таком случае PRINT 65536-USR 7962 выдаёт мне 128 байт (и 130 байт, если всё это проделывать из 48-ого режима). 128 как-то явно поменьше чем 269, куда 141 байт съелся?.. :v2_confu:

null_device
08.05.2018, 12:44
после загрузки сжатого хрумом блока куда-нибудь повыше, можно сделать CLEAR 24136

Подобные финты ушами, описаны в брошюрке Родионова (https://vtrd.in/book/ADAPT.ZIP).

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


куда 141 байт съелся?

На выполнение команд и хранение набранной строки, тоже тратится память.

ZX_NOVOSIB
08.05.2018, 14:32
print(peek 23627+256*peek23628)-(peek23635+256*peek23636)

Размер программы. Есть эмули, поддерживающие в редакторе бейсика copy-paste? :) Было бы удобно.

Shiny
08.05.2018, 14:53
Размер программы. Есть эмули, поддерживающие в редакторе бейсика copy-paste? Было бы удобно.
я делал в zxeditor (http://www.zx-modules.de/zxeditor/zxeditor.html) - пишешь текст, копипастишь в прогу, сохраняешь.

Бука
08.05.2018, 19:32
бейсика copy-paste

BASIn же.

http://speccy.info/BASin

ZX_NOVOSIB
08.05.2018, 20:11
Да это я знаю. Я выразил хотелку, что мол круто было бы иметь эмуль, который умел бы copy-paste, ладно, просто paste, хотя бы в бейсик-редакторе.

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

Скажите лучше, как из бейсика узнать, прога запущена из 48 или из 128? Должны же быть какие-то отличия в каких-то переменных, которые можно считать PEEK и сразу понять, мы в 48 или в 128 режиме находимся.

Spectramine
08.05.2018, 22:20
Да это я знаю. Я выразил хотелку, что мол круто было бы иметь эмуль, который умел бы copy-paste, ладно, просто paste, хотя бы в бейсик-редакторе.

SpecEmu умеет. Alt+P.

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


Скажите лучше, как из бейсика узнать, прога запущена из 48 или из 128? Должны же быть какие-то отличия в каких-то переменных, которые можно считать PEEK и сразу понять, мы в 48 или в 128 режиме находимся.
По адресу #5B00 в 128м бейсике - процедура переключения ПЗУ. IF PEEK 23296=245 THEN 128к.

SaintTurnip
09.05.2018, 09:32
К мастерам бейсика 48. Ищу дешевые способы организовать

- строковый массив со строками разной длины
- бинарный AND и сдвиг вправо
- бинарный XOR

Shiny
09.05.2018, 09:45
- бинарный AND и сдвиг вправо

сдвиг суть деления

a>>1 a/2
a>>2 a/4

и т.д.
с бинарными операциями можно извратиться : преобразовать число в строку и работать посимвольно.


бинарный XOR
вроде как b AND(NOT a)

Reobne
09.05.2018, 10:35
К мастерам бейсика 48. Ищу дешевые способы организовать

- строковый массив со строками разной длины
- бинарный AND и сдвиг вправо
- бинарный XOR
Можно, например, XOR на основе печати псевдографики с OVER 1(см. вложение).
Предварительно псевдосимвол "A" можно обнулить, а ячейку 16384 сохранять и восстанавливать, а цвета сделать 8. И на экране будет почти ничего не заметно.

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

А вообще, USR-ом конечно проще. :)

SaintTurnip
09.05.2018, 10:50
вроде как b AND(NOT a)

считает, что 1 xor 3 == 0

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


сдвиг суть деления
a>>1 a/2
a>>2 a/4

смущают дробные части и как себя поведет INT. впрочем, может без int.

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


А вообще, USR-ом конечно проще

Через псевдографику как-то совсем для гурманов :) А через USR - можно подробнее?

Shiny
09.05.2018, 10:59
считает, что 1 xor 3 == 0

Бинарные операции, не Бейсик
http://i104.fastpic.ru/big/2018/0509/6f/bf91ded1046cd63d427d608156d3fe6f.png



смущают дробные части и как себя поведет INT. впрочем, может без int.
Даже если не INT, а плавающая точка, то операций сдвиг не существует.

SaintTurnip
09.05.2018, 11:27
Бинарные операции, не Бейсик
http://i104.fastpic.ru/big/2018/0509/6f/bf91ded1046cd63d427d608156d3fe6f.png


он нам не питон

https://image.ibb.co/dfYqPS/not.png

Shiny
09.05.2018, 11:49
со спрайтами маешься? напиши процедуру на ассемблере и не страдай дурью.

SaintTurnip
09.05.2018, 11:54
Выводить спрайты на бейсике?

В 21 веке?

Кто я по-твоему, демосценер?

Shiny
09.05.2018, 12:04
https://vignette.wikia.nocookie.net/anime-characters-fight/images/6/60/Facepalm.png/revision/latest?cb=20150822205818&path-prefix=ru

кто-то должен проткнуть рукой лицо.

ZX_NOVOSIB
09.05.2018, 15:15
По адресу #5B00 в 128м бейсике - процедура переключения ПЗУ. IF PEEK 23296=245 THEN 128к.
Ну да, и по 23681 ещё можно наверно. Но если у человека вместо 128 бейсика что-то другое зашито, то будет фейл. Значит надо пытаться переключить страницу, помещать байт куда-то в 49152-65535, потом пытаться переключать страницу обратно и смотреть peek'ом, есть байт или нет, если нет, то 128к.

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

А вот интересно, можно ли как-то из программы, запущенной в 128-ом режиме, выполнить оператор "SPECTRUM" и чтобы при этом выполнение программы не прервалось? Что-нибудь в системных переменных намутить, обработку ошибок или чего там, чтобы вместо выдачи "0 OK , 1:1" продолжилось выполнение программы со следующей строки.

Spectramine
09.05.2018, 16:43
Ну да, и по 23681 ещё можно наверно. Но если у человека вместо 128 бейсика что-то другое зашито, то будет фейл. Значит надо пытаться переключить страницу, помещать байт куда-то в 49152-65535, потом пытаться переключать страницу обратно и смотреть peek'ом, есть байт или нет, если нет, то 128к.

Нужно правильно специфицировать, что именно нужно определять - в каком бейсике (48/128) запущена программа, или под какой моделью памяти. (Или на какой модели Спектрума). В зависимости от этого придется использовать разные способы детекта.

null_device
09.05.2018, 20:30
надо пытаться переключить страницу, помещать байт куда-то в 49152-65535, потом пытаться переключать страницу обратно и смотреть peek'ом, есть байт или нет, если нет, то 128к.

Емнип, такой способ был описан в каком-то из последних спектрофонов (http://zxpress.ru/article.php?id=4735).

ZX_NOVOSIB
09.05.2018, 20:48
null_device, "мой" способ как-то проще и короче, там, в спектрафоне, слишком сложно и длинно для меня ))

ZX_NOVOSIB
10.05.2018, 11:22
SpecEmu умеет. Alt+P.
Чот у меня не умеет ))) v3.1 от 16.03.18

Spectramine
10.05.2018, 12:33
Чот у меня не умеет ))) v3.1 от 16.03.18

Умеет, но только в 128м бейсике. Видимо, боится токенов 48го.

ZX_NOVOSIB
10.05.2018, 14:12
Умеет, но только в 128м бейсике.
У меня ни в каком не умеет, может это из-за winXP? Щас же всё заточено под 10-ки и прочие 8-ки.

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

Понял. Не работает только в режиме пентагона.

Reobne
11.05.2018, 20:16
К мастерам бейсика 48. Ищу дешевые способы организовать

- строковый массив со строками разной длины
- бинарный AND и сдвиг вправо
- бинарный XOR

Функции BIN$,AND,OR,XOR чисто средствами бейсика.
Смотри вложение:
Первые 2 DEF FN-а - служебные.
В Z$ храница таблица.
Начиная со сроки 1000 - тестирование.

ZX_NOVOSIB
15.05.2018, 18:24
А вот интересно, можно ли как-то из программы, запущенной в 128-ом режиме, выполнить оператор "SPECTRUM" и чтобы при этом выполнение программы не прервалось? Что-нибудь в системных переменных намутить, обработку ошибок или чего там, чтобы вместо выдачи "0 OK , 1:1" продолжилось выполнение программы со следующей строки.
Сам спросил - сам ответил ))
По наводке одного хорошего человека, нашлась прога, размером 45 байт, которую можно засунуть в строку REM и настанет счастье. В аттаче два файла:
test - прога на бейсике, корректно работает только в 48-ом режиме (пентагон).
test2 - та же прога, только с добавкой волшебной процедурки, а значит корректно работает из любого режима. Долой тормозной 128 бейсик, теперь всё будет быстрей! )

goodboy
15.05.2018, 19:34
Долой тормозной 128 бейсик, теперь всё будет быстрей!
я думал ты с udg символами воюешь, а тут оказываются лишние такты на прерывании.
логичней врубить im2 и не париться

ZX_NOVOSIB
15.05.2018, 20:39
goodboy, дело не только в скорости, но и в буфере принтера. 256 байт лишними не бывают, для депакера хруста например.

Ну а если на то пошло, то как включить im2?
IM2
RET
- не работает.

null_device
15.05.2018, 21:13
Ну а если на то пошло, то как включить im2?
IM2
RET
- не работает.


Тык! (http://zx-pk.ru/threads/11999-evacuator-help-thread.html?p=257422&viewfull=1#post257422)

Spectramine
15.05.2018, 21:17
я думал ты с udg символами воюешь, а тут оказываются лишние такты на прерывании.
логичней врубить im2 и не париться

Там не только лишние такты на прерывании, там на всём бейсике, похоже, лишние такты. Реально НАМНОГО тормознее. Простенькая программка, к-рая выводит стабильные разноцветные полосы на бордюре на 48, на 128 не укладывается в кадр, полосы мельтешат, и в 2 раза толще:
https://s9.postimg.cc/8htmr95wr/borderstr.png (https://postimg.cc/image/8htmr95wr/)https://s9.postimg.cc/nds5yup17/borderstr2.png (https://postimg.cc/image/nds5yup17/)

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

Вывод - 128 бейсик - полный отстой, всё, что в нём хорошего - экранный редактор.

null_device
15.05.2018, 22:41
weiv, дык - при выполнении программы, происходит обращение к "расширенному" интерпретатору, который обрабатывает "стандартные" команды, переключаясь на почти стандартное ПЗУ 48К модели.

После набора программ на 48К машине, ввод команд побуквенно, воспринимается тяжело (как и почти все прочие диалекты бейсика для него). Я, для себя в редакторе 128К машины, никаких плюсов не нашел.

Spectramine
15.05.2018, 23:03
weiv, дык - при выполнении программы, происходит обращение к "расширенному" интерпретатору, который обрабатывает "стандартные" команды, переключаясь на почти стандартное ПЗУ 48К модели.

После набора программ на 48К машине, ввод команд побуквенно, воспринимается тяжело (как и почти все прочие диалекты бейсика для него). Я, для себя в редакторе 128К машины, никаких плюсов не нашел.

Ага, но этот расширенный интерпретатор замедляет в 2 (!) и более раза и так не особо быстрый бейсик. Это какой-то позор... Из-за всего двух новых команд (а практически - из-за одной, PLAY) замедлять работу в 2 раза - это надо постараться.

А насчет ввода - дело вкуса и привычки.

null_device
16.05.2018, 03:40
Из-за всего двух новых команд (а практически - из-за одной, PLAY)

Чуть больше. Там же еще присутствуют команды для работы с "электронным диском".

AndTorp
16.05.2018, 07:45
еще присутствуют команды для работы с "электронным диском"
Какие программы используют Basic-128-реализацию электронного диска?

Бука
16.05.2018, 09:47
Какие программы используют Basic-128-реализацию электронного диска?

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

null_device
16.05.2018, 10:39
Какие программы используют Basic-128-реализацию электронного диска?

Речь не о софте, который его использует, а о функционале "вшитом" в ОС, который имеет место быть.

Хотя... XD
https://vtrd.in/full_ver/ZALUPAGA.ZIP
http://www.worldofspectrum.org/pub/sinclair/trdos/games/Hearts_2.trd.zip

ZX_NOVOSIB
16.05.2018, 11:24
Тык! (http://zx-pk.ru/threads/11999-evacuator-help-thread.html?p=257422&viewfull=1#post257422)
http://risovach.ru/upload/2018/05/mem/fraj-mne-kazhetca-ili_176879972_orig_.jpg- - - Добавлено - - -

Работа с расширенной памятью через электронный диск это хорошо, но всё портит дикая тормознутость самого 128бейсика. Однако если мы убиваем этот бейсик, то лишаемся нормальной работы с расширенной памятью из бейсика, ибо out 32765 ограничивает размер самой бейсик-проги, ибо нужен clear 49151. Засада, однако. Либо памяти 128, но тормоза и буфера принтера нет, либо буфер есть, тормозов нет, но памяти 48. Хотя, если прогу оптимизировать, чтобы влезала до 49152, то норм.

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

А если мы сделали usr0, то для переключения страниц из бейсика, нам больше не нужен poke 23388?

goodboy
16.05.2018, 11:26
А если мы сделали usr0, то для переключения страниц из бейсика, нам больше не нужен poke 23388?
да. 128ой бейсик включает нужный нам банк беря значение из этой переменной.
она проверяется в подпрограмме висящей на прерываниях.
хотя res 4,(iy+1) отключает эту проверку

creator
16.05.2018, 11:28
А если мы сделали usr0, то для переключения страниц из бейсика, нам больше не нужен poke 23388?
Не нужен. Он лежит в твоём любимом буфере принтера, который теперь свободен.

goodboy
16.05.2018, 11:33
Работа с расширенной памятью через электронный диск это хорошо
только вот в +3 изменили синтаксис для работы с рамдиском.
как итог имеем две версии программы для разных машин.
http://www.worldofspectrum.org/infoseekid.cgi?id=0018540
это кстати игра скомпиленная (hisoft) с бейсика

creator
16.05.2018, 11:39
А я вас подколю. ;)

https://www.youtube.com/watch?v=BoODgZXruxw

null_device
16.05.2018, 11:51
ZX_NOVOSIB, попробую, еще раз "разжевать", то же самое.

Сперва, пишется, непосредственно процедура обработки прерывания (кусок кода, который должен выполняться 50 раз в секунду или около того).


push ix ;cохраняются на стеке значения всех регистры процессора
push iy
push bc
push de
push hl
push af
exx
push bc
push de
push hl
ex af,af'
push af
call nn ;здесь может находиться адрес подпрограммы, вызываемый каждое прерывание или кусок кода, укладывающийся в прерывание
pop af ;восстанавливаются значения регистров процессора
pop hl ;до момента прихода прерывания
pop de
pop bc
ex af,af'
pop af
exx
pop hl
pop de
pop bc
pop iy
pop ix
jp 38 ;переход по стандартному адресу обработки прерывания im1 (команда rst 56). В противном случае, надо будет самостоятельно позаботиться об опросе порта клавиатуры, инкременте "часов" и т.п.

В ячейках памяти ОЗУ или ПЗУ с шагом в 256, лежит адрес (младший и старший байт) расположения обработчика изображенного выше. Складывающийся из значения вектора прерывания (который, за исключением подключения периферии, типа AMX-mouse, всегда имеет значение 255) и числа, записанного в регистр вектора прерывания.


di ; запретить прерывания
ld a,m ;число m, значение регистра вектора прерываний
ld i,a
im 2 ;включение режима
ei ;разрешить прерывания
ret

Для выключения режима (например, работы с tr-dos), выполняется следующий кусок кода.


di
ld a,3F ;установка исходного значения вектора прерываний, для нормальной работы в tr-dos
ld i,a
im 1 ;выключение режима
ei
ret

goodboy
16.05.2018, 12:05
ld a,3F ;установка исходного значения вектора прерываний, для нормальной работы в tr-dos
ld i,a

а как значение в I (при im1) влияет на работу trdos ?

null_device
16.05.2018, 12:42
goodboy, при im1 - никак. Сам уже не помню, почему так делал.

TomCaT
23.05.2018, 22:54
Какие программы используют Basic-128-реализацию электронного диска?

Вот, кстати, еще Swords of Bane (http://www.worldofspectrum.org/infoseekid.cgi?id=0005103)

ZX_NOVOSIB
24.05.2018, 20:57
А чем можно:
1.Нарисовать спрайт.
2.Автоматом рассовать его на UDG символы и сохранить?

Много где можно редактировать символы. Но только один символ за раз, чтобы нарисовать "продолжение" спрайта, нужно включать на редактуру другой символ, т.е. нельзя их состыковать, чтобы рисовать сразу на нескольких символах. Не в тетради же в клеточку рисовать, а потом выделять блоки 8х8 и переносить в редактор, это ж бред. Надо: нарисовал, прога сама разбила на знакоместа и показала на каких символах теперь составные части этого спрайта. Или мож есть какая прога, чтобы подсовываешь ей 6912, выделяешь нужную область и она автоматом раскидывает выделенную область по UDG-символам.

null_device
24.05.2018, 21:04
ZX_NOVOSIB, в чем проблема? Прямоугольные спрайты состоящие из знакомест 8х8 точек, спокойно пихаются в шрифт с помощью Art Studio. Либо, редактируются в том же FDE от Сталкера.

Я, в свое время, на бейсике, пытался допилить программу SPRITES из книжки "...как написать игру на бейсике".

Shiny
25.05.2018, 06:05
в ZX paintbrush при импорте выделенного участка выбирается порядок, если не ошибаюсь.

ZX_NOVOSIB
25.05.2018, 14:38
Либо, редактируются в том же FDE от Сталкера.
Где скачать?


в ZX paintbrush при импорте выделенного участка выбирается порядок, если не ошибаюсь.
Что-то такое есть. Вот выбрал я создать .chr, нарисовал чо надо, 24 символа получилось. Можно даже сохранить, сохраняется файл .chr 2 кб. А что дальше? Как это в спектрум формат запихать, вернее как узнать, какую область из этих 2 кб. запихивать? Мои 24 символа должны занимать 192 байта, где мои байты? Нафига мне 2 кб. неспектрумовского непонятно чего :(

Shiny
25.05.2018, 14:44
Вот выбрал я создать .chr, нарисовал чо надо, 24 символа получилось. Можно даже сохранить, сохраняется файл .chr 2 кб. А что дальше?

посмотри на экспорт из картинки(Block based output). отсюда же и правка на экране

ZEman
31.05.2018, 17:05
новая версия программы.
Rararura 1.9.3

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

1.9.2 (20.03.2018)
- оптимизация big mode режима.
- оптимизация текстового редактора.
- исправленна ошибка с установкой расширеных символов в текстовом редакторе.

1.9.3 (31.05.2018)
- добавлен режим Multiselect mode.
- добавлен режим mix.
- в снимок памяти добавленны метки о наличии или отсутствии шрифтов.
- переписан текстовый редактор.
- небольшой прирост скорости в текстовом редакторе.
- добавленно перемещение курсора вверх и вниз в текстовом редакторе.
- выделен курсор в текстовом редакторе.
- переписан режим Lines (рисование линий).
- изменён способ отрисовки сетки 8x8 (сетка рисуется быстрей).
- исправления и оптимизация в big mode (обработка спрайтов на 6 секунд быстрее).
- добавленна задержка в начале программы.
- оптимизация программы.

Multiselect mode - из режима Copy symbol mode можно выбрать до 15 любых символов (причём из любого из 3ёх загруженных шрифтов и системного шрифта) выбранные символы из шрифтов автоматически переведутся в UDG символы.

mix - при выборе UDG символов в начале программы - можно использовать mix (позволяет поменять местами 2 любых UDG символа).

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

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

null_device
31.05.2018, 18:50
Где скачать?
Шли в паре ЭСМИ и системных дискет того времени. На вирте, кстати, почему-то нет.
http://zxpress.ru/book_articles.php?id=895

Во втором вложении лежит чуть "допиленная" программа SPRITES. Enjoy!

ZX_NOVOSIB
31.05.2018, 19:45
FDE гляну потом с компа, када восстановлю. Пока с телефона глянул, синий квадрат и цифры внизу - не очень понятно ))

null_device
31.05.2018, 20:49
ZX_NOVOSIB, синий квадрат - рабочее "окно памяти файла". Через зажатие кнопки 0 и цифр второго синклера можно выбрать размер спрайта (или блока спрайтов). По клавише М, через пункт "screen" - выбирается режим отображения. Обычный знакогенератор, спрайт с маской или экран без атрибутов. Все отсальное, аналогчино - интуитивно. понятийно.

ZX_NOVOSIB
24.07.2018, 19:01
Решил чот демку дискануть. Бейсик защищён всякой мутью из упр.символов. Плюс там в REM парочка процедур. Загрузил бейсик в BasIN , с его помощью смог кой-чего увидеть: RANDIMIZE USR нет, вместо него выпендрёж (POKE 23613,201: POKE 23659,25: PRINT "O.K") Я попробовал вычислить адрес куда это всё приводит. В 23614 вроде 255 сидит, если в 23613 занести 201, то это укажет на чёрти куда, а это чёрти куда укажет не на адрес кода в рем-строке, а на экранную область. Короче плюнул я на это, и адрес тупо в дебагере спекулятора вычислил: 23804 (надеюсь правильно). Но всё равно хотелось бы понять, каким таким макаром 23613->201 указывает на 23804.

Сам бейсик-лоадер я прерывал тем, что первое POKE подменял на STOP прям в дебагере. Таким же макаром вставил нормальное RANDOMIZE USR 23804. Пересохранял. Всё работало идеально. До того момента, пока я не решил всё это делать с активированным тр-досом (адреса в рем сдвинулись на 112). Там в рем-строке пара процедур: 1.Рисует бегущую строку из увеличенных символов. 2.Вроде отключает брейк-останов. Я в этих процедурах все CALL и JP поправил (+112) и одно "LD BC, адрес" пришлось поправить. После этого короче нихрена не работает. Не пойму почему. Тр-дос что-то где-то меняет может, и это не нравится этим двум процедуркам?

goodboy
25.07.2018, 23:22
RANDIMIZE USR нет, вместо него выпендрёж (POKE 23613,201: POKE 23659,25: PRINT "O.K")
это на самом деле обманка. символьное представление чисел не соответствует реальным.
там переопределяется процедура печати.
23739,252
23740,92
256*92+252=23804

Bedazzle
25.07.2018, 23:24
После этого короче нихрена не работает.

А что не должно работать? Вроде скроллер бежит, музычка пиликает, буквы мерцают?

Upd.
А, туплю. В архиве же тапка. :)

Shiny
27.10.2018, 10:33
может, кто помнит такой хитрый POKE, чтобы не появлялось сообщение Scroll? ?
или не через печать 22 линий, а подольше.

ZX_NOVOSIB
27.10.2018, 12:11
или не через печать 22 линий, а подольше.
23692, 0 - будет подольше.
А поэкспериментировать с randomize usr 3582 не вариант?

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

10 PRINT AT 20,0 ; USR 3582 : GOTO 10

Bedazzle
27.10.2018, 12:23
может, кто помнит такой хитрый POKE, чтобы не появлялось сообщение Scroll? ?
или не через печать 22 линий, а подольше.

Это?

https://i.imgur.com/faslk11.png

ZEman
30.12.2018, 14:52
Rararura 1.9.4

после долгого затишья выкладываю новую версию своей программки.
из нового:

1.9.4 (30.12.2018)
- вернул загрузку внешнего модуля.
- исправления в caps lock режиме.
- оптимизация текстового редактора.
- исправленны некоторые надписи.

исправил все известные ошибки, провёл ещё небольшую оптимизацию, получил побольше свободной памяти и вернул назад модуль.
так-же в дополнение добавлен новенький мануал.
всех с наступающим !

Prusak
08.10.2020, 13:13
Имеется блок данных с бейсик-программой. Как можно из-под ассемблера её запустить на выполнение?
Скажем, можно её перекинуть на адрес, куда загружается бейсик, а как можно корректно запустить исполнение программы с нужной строки?

Bedazzle
08.10.2020, 16:58
Имеется блок данных с бейсик-программой. Как можно из-под ассемблера её запустить на выполнение?
Скажем, можно её перекинуть на адрес, куда загружается бейсик, а как можно корректно запустить исполнение программы с нужной строки?

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

Я бы попробовал поиграться с

https://i.imgur.com/b3lQZMd.png

https://i.imgur.com/LNWmTHf.png

https://i.imgur.com/WAhG20W.png

https://i.imgur.com/G05jYE9.png

А вообще - из чего вытекает такая задача? Может, достаточно из бейсика через USR запустить машкод, и потом обратно вернуться в бейсик?

goodboy
08.10.2020, 17:36
как можно корректно запустить исполнение программы с нужной строки?
погугли дизасмПЗУ, там ищи выполнение run / goto X ; только учти что run ещё чистит экран

Prusak
08.10.2020, 17:37
А вообще - из чего вытекает такая задача? Может, достаточно из бейсика через USR запустить машкод, и потом обратно вернуться в бейсик?

Из ROM-диска нужно запустить на выполнение программу-гибрид бейсика и кодов. Управляющая программа ROM-диска работает не из-под бейсика, поэтому выполнить USR, равно как и любую другую команду невозможно.

Максагор
09.10.2020, 17:36
Имеется блок данных с бейсик-программой. Как можно из-под ассемблера её запустить на выполнение?
Скажем, можно её перекинуть на адрес, куда загружается бейсик, а как можно корректно запустить исполнение программы с нужной строки?

Когда-то в одном из ZX-РЕВЮ был подробнейший разбор этой темы. В каком номере - сейчс не скажу. Но был точно.

ivagor
09.10.2020, 19:24
Имеется блок данных с бейсик-программой. Как можно из-под ассемблера её запустить на выполнение?
Если не экономить память, то есть очень дубовый способ. Пусть программа в памяти, набираем в строке редактирования RUN (без enter). Сохраняем системные переменные и саму программу. Теперь когда надо запустить возвращаем системные переменные и программу на место и переходим по адресу 12DDh. Несомненно этот способ можно улучшить и оптимизировать, но если других вариантов пока нет, то он работает.

goodboy
09.10.2020, 19:40
я кстати делал похожим способом, только кажется в первой строке исполнялось pause 0,
запустив сохранял память, потом сжимал ну и после разжима делал jp в ПЗУ

Prusak
09.10.2020, 21:33
Для сохранения памяти нужно входить в TR-DOS и делать сохранение области с #5B00 и до конца памяти. Но при этом же не сохранится команда RUN, она же не будет набрана.

goodboy
09.10.2020, 22:21
я сохранял память под эмулем.
в ZXreview скорее всего делали автостарт программы в составе кодового блока.
первая строка бейсика что-то типа
1 save "test" code 23552,1704
2 текст программы
на момент отгрузки в переменных будет следующая строка/оператор
но это явно не твой случай
..........
вспомнил. я делал перехват на адресе #2D2B; BC=№номер строки
загрузив программу на бейсике ставил BreakPoint и выполнял gotoX
после этого сохранял всю память, сжимал и после загрузки/разжатия (важно правильно выставить стек)
делал jp #2d2b
..........
этот способ я подсмотрел в игре I of the Mask

ivagor
10.10.2020, 07:20
сохранение области с #5B00 и до конца памяти
Если программа на бейсике занимает не всю память, то стоит ограничиться только ей (посмотреть в отладчике эмулятора где она оканчивается) + системные переменные до нее.


Для сохранения памяти нужно входить в TR-DOS
Сохранение из TR-DOS обязательное условие (его не было в посте с вопросом)? Если нет, то goodboy написал про сохранение из эмулятора.

Еще я забыл важный момент. Стартовые условия могут быть разные, поэтому лучше задать ld iy,5C3Ah. Содержимое стека, насколько помню, в "моем" варианте сохранять не обязательно.

Barmaley_m
10.10.2020, 17:36
Способов запустить бейсик-программу из ассемблера существует великое множество, но все они должны быть основаны на анализе дизассемблера бейсика (Ian Logan, Frank O'Hara, "The complete ZX Spectrum ROM disassembly"). Потому, что документированных и облегчённых способов запуска нет, а остальные подразумевают "обман" в той или иной форме, подстановка бейсику того, что он увидит так, как хочется автору.

Вариент - изучить процедуру "Load" с кассеты. Там после загрузки заголовка сначала ликвидируется "старая", находящаяся в памяти, программа. Затем выделяется память под новую программу и её переменные. И, наконец, загружается и запускается новая программа.

Изучив процедуру "Load", можно реализовать её заново в своём коде, выбросив оттуда лишнее и вставив недостающее.

Barmaley_m
10.10.2020, 22:38
Что я только что и проделал. Для понимания изложенного ниже требуется скачать и открыть Логана и ОХару.

Интересующая нас часть процедуры "Load" находится по адресу 0x0873 под названием "LD-PROG".

Сначала вызовом процедуры "RECLAIM-1" освобождается память от "старой" программы. Затем вызовом "MAKE-ROOM" выделяется память под новую программу и её переменные. Освобождение и выделение памяти через "RECLAIM-1" и "MAKE-ROOM" освобождают программиста от заботы о системных переменных в этих процессах.

После этого из кассетного заголовка извлекается длина программы без учёта длины её переменных и устанавливается системная переменная "VARS" на начало области переменных.

Далее номер строки, с которой программа должна запуститься, заносится в системную переменную "NEWPPC", а номер оператора в строке (системная переменная NSPPC) - обнуляется.

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

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

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

Добавка. Если ассемблерная программа была вызвана не через USR, а каким-то другим способом - то точка входа в интерпретатор для начала исполнения программы - это 0x1B7d, "STMT-R-1".

Перед переходом на неё необходимо загрузить указатель стека из системной переменной ERR-SP: LD SP,(23613)

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

Если же системные переменные испорчены, и требуется их полная инициализация - то она находится в бейсике по адресам 11EF-12A2. Объём этого кода короче, чем сохранённая копия всех системных переменных.

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

Ещё немного подумал. Возврат из USR, описанный выше, может привести к сбою, так как USR - это функция, являющаяся частью выражения. Если для команды LOAD допустимо возвращаться с подменой программы, то для USR - нет.

В случае LOAD идёт возврат из исполнения команды на цикл исполнения программы. Так как системная переменная NSPPC была обнулена, то поиск строки к исполнению начинается заново, что и приводит к запуску загруженной программы без учёта того, что находилось в области памяти, где была команда LOAD и что следовало за ней.

Но вызов ассемблерной программы через USR - это не команда, а часть выражения. USR - это функция, а выражение может продолжаться после неё. Таким образом, если ассемблерная программа перепахала память, где находился вызов функции USR - то вычисление выражения будет продолжено с того же места, а так как там уже находится другая программа - то скорее всего это приведёт к ошибке C Nonsense in BASIC.

Так что запуск программы только через STMT-R-1 и инициализацию стека.

Prusak
11.10.2020, 15:29
Кое-какие результаты есть: программа работает, но при попытке её остановка и выхода в бейсик, всё подвисает.

Barmaley_m
13.10.2020, 22:45
Вероятнее всего, адрес возврата в стеке (ERR_SP) неправильный. Каким образом ты добился запуска программы?

Prusak
14.10.2020, 09:02
Сначала инициализировал системные переменные (взял код из ПЗУ по адресам по адресам 11EF-12A2).

Дальше взял кусок кода из процедуры LD-PROG. Формирую header бейсик файла, подставляю туда нужные данные (длина файла, длина бейсик-части, стартовая строка), дальше, если я правильно понял, в коде резервируется место для альтернативного header'а, куда сохраняются данные о текущей бейсик-программе в памяти, на основании которых удаляется текущая бейсик-программа и резервируется место для новой программы.

Потом загружаю бейсик программу в нужные адреса памяти, загружаю указатель стека из системной переменной ERR-SP: LD SP,(23613) и делаю переход на 0x1B7d, "STMT-R-1".

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

Barmaley_m
18.10.2020, 00:08
Понятно. В таком случае, думаю, нужно после LD SP,(23613) сделать следующее:


POP HL
LD HL,1303H ; MAIN-4 Error entry point
PUSH HL
JP 1B7DH

тем самым прописывается нужный адрес возврата при ошибке (в том числе 0 OK).

Andrew771
18.10.2020, 00:31
Насколько я помню по книге "Как написать игру на ассемблере", при выходе в Бейсик нужно восстанавливать регистровые пары IY и HL' вроде. Но лучше уточнить в книге.

Barmaley_m
18.10.2020, 11:49
при выходе в Бейсик нужно восстанавливать регистровые пары IY и HL'
Хорошо, что напомнил. Устанавливать IY на значение 0x5C3A - это, конечно, необходимо при любых делах с бейсиком. Даже при работе прерываний для опроса клавиатуры бейсик использует этот регистр и требует, чтобы в нём содержалось это значение.

Но вот насчёт HL' - это зависит от точки входа в бейсик. Вероятно, в книге "Как написать игру" имелся в виду возврат из функции USR - а это происходит куда-то в недра "калькулятора" и процедуры вычисления выражений. Вход же в бейсик на точку STMT-R-1 - это совсем другое дело, и там содержимое регистра HL' роли не играет.

Prusak
19.10.2020, 00:14
Устанавливать IY на значение 0x5C3A - это, конечно, необходимо при любых делах с бейсиком. Даже при работе прерываний для опроса клавиатуры бейсик использует этот регистр и требует, чтобы в нём содержалось это значение.

Да, этот момент я помню, и, если мне память не изменяет "правильное" значение для IY устанавливается при инициализации системных переменных.

Grand
22.10.2020, 05:22
А почему не посмотрите архив исходников TR-DOS Navigator'а (https://zx-pk.ru/threads/2952l)?
Там как-раз так BASIC-программа и запускается.
Файл TRDNC.ASM: процедура EXIT.
Файл COMMENTS.TXT: описание в разделе "Запуск файлов и выход из TRDN".

Barmaley_m
23.10.2020, 23:09
А почему не посмотрите архив исходников TR-DOS Navigator'а (https://zx-pk.ru/threads/2952l)?
Дело в том, что из бутов, коммандеров и навигаторов программа часто запускается путём исполнения команды "RUN" в TR-DOS. Это самый простой способ. И тогда уже TR-DOS занимается выделением памяти и запуском, а не коммандер. Если ты уверен, что в коммандере программа запускается именно на низком уровне, наподобие того, как я рекомендовал - то подскажи. В противном случае жизни не хватит копаться во всех коммандерах и разочаровываться.

Prusak, как твои успехи? Ты поборол проблему сбоя по завершении программы?

Narick
25.10.2020, 22:27
Ребят хочу сделать девушке романтический мини-сюрприз . Скинте плз листинг отрисовки сердца в zxbasic . Кому не сложно

Prusak
25.10.2020, 23:15
Prusak, как твои успехи? Ты поборол проблему сбоя по завершении программы?

По методике из исходников TRDN, к сожалению, не получается. На выходе компьютер просто "повисает".

Grand
26.10.2020, 04:55
...жизни не хватит копаться во всех коммандерах и разочаровываться.Поэтому я и порекомендавал почитать файл COMMENTS.TXT в архиве исходников TRDN (https://zx-pk.ru/threads/2952l). Не зря же мы его писали. Там все кратко и по-русски. :) Если информация заинтересует - можно посмотреть и сами исходники. А появятся вопросы - спрашивайте. Лучше в теме про TRDN (https://zx-pk.ru/threads/2952l). :)

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


По методике из исходников TRDN, к сожалению, не получается. На выходе компьютер просто "повисает".Теперь надо проверить правильно ли выставлен RAMTOP и указывает ли на дно машинного стека 23613; на дне должен быть адрес системной процедуры обработки ошибки.

Andrew771
27.10.2020, 21:45
Ребят хочу сделать девушке романтический мини-сюрприз . Скинте плз листинг отрисовки сердца в zxbasic . Кому не сложно
Ну если сердечко из символов, то просто сначала нарисуй на клетчатой бумаге 32х24, а потом закодируй на Бейсике командами PRINT AT...
А можь найти готовое демо для Спека? Такие романтичные вообще были? :)

Prusak
28.10.2020, 08:56
По теме запуска бейсик программы "с ноля". Совместными усилиями проблема решена.
Нужно было на стек "положить" адрес #1303.
Всем причастным спасибо за помощь :)

Grand
01.11.2020, 10:38
Из ROM-диска нужно запустить на выполнение программу-гибрид бейсика и кодов. Управляющая программа ROM-диска работает не из-под бейсикаИменно в таком виде задачу по запуску BASIC-программы мне решать не приходилось, и она меня заинтересовала.
Во вложении исходный ассемблерный текст и откомпилированный вариант моего решения. Образ диска имеет структуру каталогов Directory System (но на это внимание можно не обращать). Подробности в файле install.txt.
Работа кода происходит так.
Обнуляется область памяти под системные переменные системы ZX Spectrum (за основу взят код из TR-DOS). По новой организуется область системных переменных и инициализация рабочих областей. Переменные TR-DOS не организовываются. Выделяется место под BASIC-программу и переносятся туда ее данные. Запускается BASIC-программа.


Ребят хочу сделать девушке романтический мини-сюрприз . Скинте плз листинг отрисовки сердца в zxbasic . Кому не сложноПопутно решена и эта задача. BASIC-программа в коде - рисует на экране сердце. :D

Barmaley_m
01.11.2020, 12:44
Ребят хочу сделать девушке романтический мини-сюрприз . Скинте плз листинг отрисовки сердца в zxbasic . Кому не сложно
На чём запускать будешь? У девушки есть железный спек?

Могу поделиться своим "мини-сюрпризом для девушки", который я делал в 1995-1997гг. Это плата с Z80, AY, ПЗУ и ОЗУ. Подключается 7-сегментный индикатор и 7 кнопок. Можно проигрывать несколько музык на AY в формате ProTracker 2. Также реализованы часы, будильник и др.

Narick
06.11.2020, 18:53
На чём запускать будешь? У девушки есть железный спек?

Могу поделиться своим "мини-сюрпризом для девушки", который я делал в 1995-1997гг. Это плата с Z80, AY, ПЗУ и ОЗУ. Подключается 7-сегментный индикатор и 7 кнопок. Можно проигрывать несколько музык на AY в формате ProTracker 2. Также реализованы часы, будильник и др.

Железный спек есть у меня . Она кодерша C++ так что думаю оценит( мой уровень в любом кодинге стремиться к 0 . Лет 20 не практиковался ) . Схемой поделиться ? Я не паяльник я ломльник ))) . Но все равно буду благодарен

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


Именно в таком виде задачу по запуску BASIC-программы мне решать не приходилось, и она меня заинтересовала.
Во вложении исходный ассемблерный текст и откомпилированный вариант моего решения. Образ диска имеет структуру каталогов Directory System (но на это внимание можно не обращать). Подробности в файле install.txt.
Работа кода происходит так.
Обнуляется область памяти под системные переменные системы ZX Spectrum (за основу взят код из TR-DOS). По новой организуется область системных переменных и инициализация рабочих областей. Переменные TR-DOS не организовываются. Выделяется место под BASIC-программу и переносятся туда ее данные. Запускается BASIC-программа.

Попутно решена и эта задача. BASIC-программа в коде - рисует на экране сердце. :D

Спс ща на эмуле тест проведу и на реал

ZEman
19.06.2021, 14:26
кто подскажет, можно ли с помощью FOR перичислять переменные ?
например у меня есть строка:

3005 POKE USR A$,I1: POKE USR A$+1,I2: POKE USR A$+2,I3: POKE USR A$+3,I4: POKE USR A$+4,I5: POKE USR A$+5,I6: POKE USR A$+6,I7: POKE USR A$+7,I8

Я её хочу записать так:

FOR g= 1 TO 8: POKE USR A$+g,I(g): NEXT g

но мне выдаётся ошибка 2 variable not found.
можно это как-то обойти ?

ps. в ближайшее время будет обновление программки.

goodboy
19.06.2021, 15:37
FOR g= 1 TO 8
для начала g=0 TO 7

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


I(g)
бейсик это воспринимает как ячейку массива

ZEman
19.06.2021, 15:55
для начала g=0 TO 7
но у меня то переменные I1 - I8 (то-есть от 1 до 8 ).


бейсик это воспринимает как ячейку массива
а чтоб номер переменной листал нельзя ?

goodboy
19.06.2021, 16:59
тогда начнётся сбой на этапе

POKE USR A$+g
число будет записано в ячейку на 1 больше чем USR A$,I1

ZEman
19.06.2021, 17:16
понятно.
спасибо за разъяснение.

ZEman
20.06.2021, 18:07
ещё один вопрос.
имеется такая строчка:

10 INPUT g: IF g<0 OR g>255 THEN GO TO 10

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

Black Cat / Era CG
20.06.2021, 18:15
Можно запрашивать строку, а потом конвертить в число (обрабатывая "ошибки"), но это тоже не панацея.

null_device
22.06.2021, 05:38
ZEman, обязательно нужен ручной ввод числового значения?
Как вариант, можно организовать его как ввод симовольной переменной с последующим преобразованием в число. Правда, получится, весьма громоздкая конструкция.

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

Например, вот такая:

10 INPUT LINE g$: IF LEN g$<1 OR LEN g$>3 THEN GOTO 10
12 IF LEN g$=3 AND CODE g$(1)>47 AND CODE g$(1)<51 THEN
IF CODE g$(2)>47 AND CODE g$(2)<54 THEN
IF CODE g$(3)>47 AND CODE g$(3)<54 THEN
LET g=(CODE g$(3)-48)+(CODE g$(2)-48)*10+(CODE g$(1)-48)*100: GOTO 22
14 IF LEN g$=2 AND CODE g$(1)>47 AND CODE g$(1)<58 THEN
IF CODE g$(2)>47 AND CODE g$(2)<58 THEN
LET g=(CODE g$(2)-48)+(CODE g$(1)-48)*10: GOTO 22
18 IF LEN g$=1 AND CODE g$(1)>47 AND CODE g$(1)<58 THEN
LET g=CODE g$(1)-48: GOTO 22
20 GOTO 10
22 STOP

Black Cat / Era CG
22.06.2021, 09:40
Есть же функция преобразования символов в чисто, правда не помню, как она реагирует на нецифровые символы.

null_device
22.06.2021, 12:04
Black Cat / Era CG, есть обратная функция - STR$.
Беда в том, что команда INPUT, может принимать в качестве входных числовых данных, любую белиберду. Алгебраические выражения и имена переменных.

ZEman
22.06.2021, 13:34
Видимо потом буду делать через inkey$ и let.
Так меньше проблем будет.

null_device
22.06.2021, 15:12
ZEman, я же, тремя сообщениями выше накидал рабочий вариант. Чем не нравится? :)

ZEman
22.06.2021, 19:55
null_device, вариант неплохой.
но, Я стремлюсь к тому чтобы выжать из программы как можно больше свободной памяти, сохранив при этом все имеющеюся фишки программы.
то-есть ничего не удаляется, весь функционал остаётся тем-же, но при этом получаешь больше памяти.

Andrew771
23.06.2021, 21:59
Через INKEY$ самое нормальное.
А если INPUT A$, то выводятся поганые кавычки еще, раздражали в своё время.
В ZX Like Pascal, кстати, я решил эту проблему кардинально во встроенной процедуре обработки ошибок. Если для числовой переменной A юзер вводит в readln(A) не число или число больше, чем поддерживает тип, то его введенная строка стирается и запрашивается заново.

ZEman
24.06.2021, 17:41
Rararura 1.9.5

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


список изменений:

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

через пару - тройку месяцев выпущу ещё одну, скорее всего последнюю версию данной программы, в которой я добавлю много интересного.

null_device
25.06.2021, 11:25
Через INKEY$ самое нормальное.
А если INPUT A$, то выводятся поганые кавычки еще, раздражали в своё время.

Поганые кавычки при вводе символьной переменной, через оператор INPUT, убираются добавлением команды LINE. :)

Andrew771
27.06.2021, 21:38
Поганые кавычки при вводе символьной переменной, через оператор INPUT, убираются добавлением команды LINE
Та-ак, вот с этого места поподробнее пожалуйста, первый раз про такое слышу. Как я должен написать? А то блин, все 90е годы проматерился и обходил это инкеем :)

jerri
27.06.2021, 22:08
Та-ак, вот с этого места поподробнее пожалуйста, первый раз про такое слышу. Как я должен написать? А то блин, все 90е годы проматерился и обходил это инкеем :)

INPUT LINE A$

Andrew771
27.06.2021, 22:25
INPUT LINE A$
прикольненько, буду знать! Пасибо. (Хотя, вряд ли уже понадобится)

ZEman
02.07.2021, 16:13
прошу помощи ибо никак не выходит.
есть програмка - текстовый редактор (листинг и снапшот прилагается).
и всё бы хорошо, всё прекрасно работает.
но есть маленький недочёт который меня просто бесит.
курсор перемещается с помощью клавиш стрелок и любая другая клавиша ставит символ на экране.
если перемещая курсор по экрану, зажать одну клавишу например стрелку влево - курсор бежит влево.
если теперь не отпуская клавиши нажать другую клавишу стрелку то на экран будет выводиться одна из цифр (5 6 7 или 8).

как это можно обойти ?
как сбросить байт отвечающий за зажатую клавишу SHIFT чтоб понималось только значение нажатой стрелки ?

null_device
03.07.2021, 11:15
ZEman, если все это происходит на реале, это какая-то особенность именно вашего "железа". Реализация узла контроллера клавиатуры, или непосредственно пленок в ней. Т.к. при опросе через функцию INKEY$, при одновременном нажатии двух клавиш "базовой матрицы", она возвращает "пустой" аргумент (значение "ноль").

ZEman
03.07.2021, 12:42
происходит это всё на эмуляторе, Я в основном использую ZX SPIN.
две клавиши (стрелки) надо зажать всего лишь на секунду, затем одну отпустить а вторую продолжать удерживать.
после этого будет печататься одна из цифр - 5, 6, 7 или 8 хотя удерживается стрелка.

вставлял в программу такую строчку:
7602 строчку делаем например 7605ой

7603 PRINT #0; AT 1,0;P;" "

и видим что при этом значение ставится 53 - 56 (код цифр 5 - 8).

null_device
03.07.2021, 12:56
ZEman, не все эмуляторы "одинаково полезны". Скоре всего, это "баго-фича" реализации опроса клавиатуры.
Мне, повторить подобное в анреале и спектакуляторе - не удалось.

ZEman
03.07.2021, 13:30
Я вот тоже ща проверил действительно этот баг тока в ZX SPIN появляется.
твоюж:v2_dizzy_wall:
а Я уже 2 дня ломаю голову.
а на реале такое никто не может проверить ?
у меня спек тоже есть но вот как его подключить к новым жк я не знаю.

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

кстати такая ошибка есть в эмуляторах:
Emuzwin
ZX SPIN
FUSE
Spectramine - который позиционируется как особо точный :)
spectrum_ZigaRamsak
Speccy 6.0

а нет глюка в таких как:
ZXMAK 2
Unreal speccy
Spectaculator
specemu-3.1.b201120
EmuZGL_Preview

кому верить то ?

null_device
03.07.2021, 13:59
ZEman, у меня, на реальных клонах - работало, именно как на спектакуляторе и анреале.
Может, что-то не совсем правильно настроено в параметрах эмуляции клавиатуры?


две клавиши (стрелки) надо зажать всего лишь на секунду, затем одну отпустить а вторую продолжать удерживать.
после этого будет печататься одна из цифр - 5, 6, 7 или 8 хотя удерживается стрелка.
Курсорные клавиши, это как бы одновременно зажатие двух клавиши: SHIFT и четыре кнопки верхнего полуряда. При этом SHIFT должен нажиматься первым, иначе и полезут цифры.

ZEman
01.10.2021, 16:16
Rararura 1.9.6

новая версия программы.
можно сказать здесь самое большое обновление за всю историю создания программы.

список изменений:

- улучшен режим Multiselect mode.
теперь можно получить при наличии big sprite - 15 символов.
при отсутствии big sprite - 21 символ.
- добавлено перемещение курсора по вертикали в copy symbol mode.
- добавлено удаление big sprite из меню big mode режима.
- в режим сдвига символа добавлен сдвиг влево и сдвиг вверх.
- изменено меню текстового редактора, сохранение текста теперь делается отдельно.
- в режиме линий добавлен выбор - рисовать линию или стирать линию.
- INPUTы были заменены на меню ввода данных.
- новый вид индикатора caps lock.
- сделана защита big sprite - символы, входящие в состав big sprite не могут быть изменены.
- добавлен выбор любого цвета для сетки 8х8 и для курсора.
- добавлена тёмная тема (активируется при выборе чёрного цвета для сетки 8х8).
- добавлено закрашивание двух нижних (служебных) строк в некоторых режимах.
- добавлен индикатор обработки спрайтов в big mode.
- перенёс сброс программы в главное меню.
- добавлен индикатор в create new font mode.
- добавлены звуковые сигналы в разных режимах.
- исправлена ошибка с надписью в data symbol mode.
- исправлена ошибка в текстовом редакторе.
- исправлена ошибка приводящая к разрушению сетки 8х8.
- исправлена ошибка при создании big sprite в big mode режиме.
- исправлена ошибка с сохранением метки в снимок памяти.
- небольшие изменения в модуле.
- улучшен режим сдвига символа.
- секрет (найдите его сами).
- оптимизация программы.

также прилагается мануал и листинг программы.
ссылка на мануал: https://disk.yandex.ru/i/eieQQ0Gsaw0y0A

Zidane
23.11.2021, 14:22
Доброго времени суток. Возникло легкое непонимание. При записи В системную переменную 23607, для выбора другой таблицы символов, мы получается, просто сдвигаем адрес, с которого начинается чтение кодов символов? Кроме того, как я понял, символы с кодами 0-31 переопределить нельзя, но в общей таблице адресов альтернативного набора символов их все равно надо учитывать. Я прав? Прошу извинить, если вам мои вопросы кажутся несколько... простыми. Но тут вопрос правильности понимания мною системы. Спасибо.

reddie
23.11.2021, 15:28
просто сдвигаем адрес, с которого начинается чтение кодов символов?
В общем случае - да, бейсиковские процедуры ПЗУ берут адрес знакогенератора из переменной (23606/607).


символы с кодами 0-31 переопределить нельзя
Если пользоваться процедурами ПЗУ - да, эти коды (часть) интерпретируются как управляющие.


но в общей таблице адресов альтернативного набора символов их все равно надо учитывать
Если точнее - адрес в переменной 23606/607 уже содержит смещение +256 от "нулевого" символа, т.е. первые 32 пропускаются.
Соответственно, загружая фонт по условному адресу #С000, в переменную нужно ложить #BF00. Это если фонт неполный, разумеется.
Если же пользоваться своей процедурой печати и набор полный (с нулевого символа), то этой продедуре дается реальный адрес фонта,
а печатать можно хоть все 256 символов, что стандартная процедура RST#10 сделать не позволит.

ВитГо
23.02.2022, 22:34
просто поржать

https://youtu.be/4L_gdmcYbvw

такие вот игрухи писал лет в 14 когда ходил на кружок по программированию...
сейчас вот увидел на ютубе что кто то пытается что то писать и решил вспомнить...

а где нить на форуме есть раздел простых игр на бейсике ? без 1000 строк бесконечного набора...

Zidane
23.02.2022, 22:50
Зацепило, да? Хех, я старался. Вот тебе книжка с играми на BASIC. Игры в большинстве своем, правда, так себе... Типа топора гоняющегося за чуваком, но есть и интересные. Особенно мне нравится как реализован опрос клавиатуры в некоторых играх - через опрос порта. https://zxpress.ru/book.php?id=45 правда в большинстве своем они подразумевают русифицированный бейсик. Но мне кажется это не критично ) Кстати в редакторе номера строк считаются исключительно по цифрам, как и в оригинальном Spectrum-Basic. Переносы без номеров просто для удобства чтения кода.

Некоторые программы в книге, кстати, работают несколько криво

ВитГо
23.02.2022, 22:57
Особенно мне нравится как реализован опрос клавиатуры в некоторых играх - через опрос порта
ну на асме да, а на бейсике все таки хочется простоты...


Зацепило, да?
да нет, просто написал на ютубе мол долго пишите игру, там делов то на 20 строк, вот и взяли меня на слабо :-))
дольше эмулятор искал нормальный, а то уж лет 25 прошло как спектрум видел... совсем не помню набор на его клавиатуре - а в эмуляторах вечно какие то виртуальные клавы оторванные от PC и набрать что то более менее объемное не реально...
вот и подумал потом - что может где есть тема какая нить с простенькими играми... чтобы за 10 минут набрать можно было бы...

ZEman
06.03.2022, 08:55
Rararura 1.9.8

новое обновление программы.
проделал большую работу над программой и её оптимизацией, теперь многие режимы работают намного быстрей и потребляют мало памяти.
также исправил все известные мне ошибки и дополнил всё это тремя модулями.
модуль - это отдельная подпрограмма которую можно загрузить с ленты в Rararura и тем самым расширить возможности программы.
ниже представлены 3 модуля:
font - быстрое создание новых шрифтов из udg спрайтов.
raskraska - можно загрузить картинку и раскрасить её как угодно (к сожалению процесс раскраски довольно долгий, но результат можно сохранять в любой момент).
screen_position_modul - в режиме complete теперь можно поставить экран (две нижние служебные строки) на любой позиции.

список изменений:

1.9.7 (20.11.2021)
- выбор любого цвета сетки 8х8 в тёмной теме.
- переделано ядро программы.
- спрайты обрабатываемых символов сохраняются другим, более экономным способом.
- исправленна ошибка с выводом мусора в двух нижних строчках текстового редактора.
- оптимизация программы.

1.9.8 (06.03.2022)
- увеличена скорость обработки спрайтов в большинстве режимов программы, теперь:
big mode - работает на 15 секунд быстрей.
multiselect mode - работает на 25 секунд быстрей.
рисование и запись экрана - работает на 8 секунд быстрей.
complete - работает на 65 секунд быстрей.
- добавлен индикатор количества выбранных символов для Multiselect в copy symbol mode.
- добавленны рандомайзеры для big mode, about и random symbol mode, теперь узоры в этих режимах никогда не повторяются.
- новый вид графика в memory test.
- теперь значение в memory test не может переполниться.
- исправлены некоторые надписи.
- исправленна ошибка с вставкой текста из текстового редактора в big mode режим.
- исправленна ошибка с выставлением одинакового цвета для курсора и фона в меню выбора символа.
- оптимизация программы.

ZEman
08.03.2022, 09:55
такой вопрос появился:
правильно ли Я понимаю что из бейсика Спектрум 48к нельзя записывать (загружать) информацию с дисков ?
нет никаких способов ?

Black Cat / Era CG
08.03.2022, 11:11
правильно ли Я понимаю что из бейсика Спектрум 48к нельзя записывать (загружать) информацию с дисков ?
нет никаких способов ?
Какую? Кодовые блоки можно сохранять, подгружать. Вроде бы массивы тоже можно. Как и с кассеты.

ZEman
08.03.2022, 13:00
а как ?
я читал на zxpress.ru что вроде нельзя такое без тр-доса.
пробовал набрать типа RANDOMIZE USR 15619: REM : LOAD ""CODE 64660,704 программа просто зависала.

Black Cat / Era CG
08.03.2022, 13:03
я читал на zxpress.ru что вроде нельзя такое без тр-доса.Так без него конечно нельзя, это же дос. Тогда странный вопрос. Откуда ж дискам без ТР-ДОС взяться?

ZEman
08.03.2022, 13:08
значит это только в 128к версии спектрума можно и без тр-доса никак.

Black Cat / Era CG
08.03.2022, 13:20
значит это только в 128к версии спектрума можно и без тр-доса никак.да нет же. в 48 с тр-дос.

ZEman
08.03.2022, 13:27
а где можно взять тр-дос для 48к версии ?
чёт я не нахожу такого.

Black Cat / Era CG
08.03.2022, 13:37
тр-дос один и тот же.

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

Вы же в эмуляторе.

ZEman
08.03.2022, 13:42
этот чтоли ? TR-DOS+ by Bredsoft'96 https://vtrd.in/system/TR-DOS+.zip
смотрю на виртуал трдос.

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

там scl образ который в 48к никак.

Black Cat / Era CG
08.03.2022, 14:08
О_о Зачем образ? Если эмуль, то надо настроить 48+тр-дос (а проще просто перейти из меню пентагона в бейсик 48 и все).
А если железка, то там либо есть BDI, либо нет.
Это как миф про то, что на 48 не может быть AY.
Лет 5 просидел на Форум БК-011 Турбо, а это именно 48, с YM и BDI.

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

А может просто бесик-прога съела всю память, поэтому попытка вызвать команду тр-дос подвешивает спек?
Надо попробовать из голого барсика.

null_device
10.03.2022, 15:06
ZEman, tr-dos - не более, чем название программной части "карточки расширения" Beta Disk Interface. При его физическом отсутствии (в т.ч. конфигурации эмулированной машины), вызов команд tr-dos, через стандартные точки - равносильно попытке исполнения некоего кода из ПЗУ в области знакогенератора. Со вполне предсказуемым итогом. ;)

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

А вот, после подключения BDI, при попытке выполнить код из определенного диапазона адресов - стандартное (или, не совсем) ПЗУ спектрума, подменяется ПЗУ tr-dos. По завершению исполнения подпрограмм, все возвращается на прежнее место.

LW
13.02.2023, 19:46
Тут уже поднимался вопрос как из кода исполнить бейсик команду.
Предложенный вариант несколько не устроил, хотелось запускать не программу с номерами строки и т.п. а просто один или несколько операторов.
Покопавшись в пзу, пришел к такому решению:


;инициализация переменных для старта программы в basic48 режиме
;(с открытым портом)
;
;очистим всю память 48k
di
ld hl,#5B00
ld de,#5B01
ld (hl),l
ld bc,#A500-1
ldir

;инициализируем переменные
ld hl,#FFFF ;P-RAMT
ld (#5CB4),hl
ld de,#3EAF ;UDG
ld bc,#00A8
ex de,hl
lddr
inc de
ld (#5C7B),de ;=#FF58
dec de
ld (#5CB2),de ;=#FF57
ld hl,#0040 ;PIP and RASP
ld (#5C38),hl
ld hl,#3C00 ;CHARS
ld (#5C36),hl
ex de,hl
ld (hl),#3E ;маркер
dec hl
ld sp,hl
dec hl
dec hl
ld (#5C3D),hl ;ERR_SP
ld iy,#5C3A
ld hl,#5CB6
ld (#5C4F),hl ;CHANS
ld de,#15AF ;каналы
ld bc,#0015
ex de,hl
ldir
ex de,hl
dec hl
ld (#5C57),hl ;DATADD
inc hl
ld (#5C53),hl ;PROG =#5CCB
ld (#5C4B),hl ;VARS =#5CCB
ld (hl),#80
inc hl
ld (#5C59),hl ;E_LINE =#5CCC
ld a,#38 ;атрибуты
ld (#5C8D),a
ld (#5C8F),a
ld (#5C48),a
ld hl,#0523 ;REPDEL and REPPER
ld (#5C09),hl
dec (iy-#3A)
dec (iy-#36)
ld hl,#15C6 ;STRMS-FD
ld de,#5C10
ld bc,#000E
ldir
set 1,(iy+#01)
call #0EDF ;CLEAR-PRB
ld (iy+#31),#02 ;DF_SZ
; call #0D6B ;CLS (не обязательно)
call #16B0 ;SET-MIN
xor a
call #1601 ;канал 'K'

;и только теперь можно копировать строку с программой
ld hl,basic ;адрес строки
ld bc,end-basic ;длиина строки
ld de,(#5C5B)
ldir
ld (#5C5B),de
ex de,hl
ld (hl),#0D
inc hl
ld (hl),#80
inc hl
ld (#5C61),hl ;WORKSP
ld (#5C63),hl ;STKBOT
ld (#5C65),hl ;STKEND
ld a,#0D ;клавиша enter
ld (#5C08),a
ld hl,#5C3B ;нажата
set 5,(hl)

im 1
ei
jp #12B1 ;адрес входа в basic

basic db #EF,#22,#22 ;load ""
end



возможно кому-то пригодится

goodboy
13.02.2023, 19:54
теперь можно копировать строку с программой
а зачем её копировать если начало программы может быть практически где угодно

LW
13.02.2023, 20:08
ну дело ваше, не хотите не копируйте, а мне без копирования никак

ZEman
17.02.2023, 20:30
Rararura 2.0

прошёл почти год и вот Я снова вернулся.
на этот раз была проделана огромная работа над программой в результате чего во многих режимах была увеличена скорость работы программы.
очень сильно переделал Big mode - теперь там целых 3 режима обработки спрайтов, можно обрабатывать 2 нижние (служебные) строчки, а также можно прервать обработку в любой момент или выйти в меню, ну и самое главное скорость обработки в 5 ! раз быстрее.
также полностью переделал multiselect - теперь он выглядит совершенно по новому и работает очень быстро.

список изменений:
- расширение режима big mode, теперь можно обрабатывать две нижние (служебные строчки).
- появились 3 опции в big mode:
стандартная (only big sprite) - обработка 6 спрайтов из картинки и создание big sprite.
расширенная (21 udg) - обработка до 21 спрайта из картинки, big sprite не создаётся.
шрифт режим (font mode) - обработка до 96 спрайтов из картинки, big sprite не создаётся. спрайты импортируются в font 3.
- стандартная обработка спрайтов в big mode теперь занимает всего 6 секунд, расширенная 20 секунд, шрифт режим 59 секунд.
- в расширенном или шрифт режиме можно остановить выбор спрайтов в любой момент по нажатию кнопки SPACE, обработка будет проводиться до последнего выбранного спрайта.
- в расширенном или шрифт режиме можно видеть количество выбранных спрайтов (синяя прозрачная полоса в верхней части экрана).
- выход из big mode режима в любой момент в главное меню по кнопке ENTER.
- изменён индикатор обработки спрайтов в big mode (теперь это смена цвета border).
- новый вид multiselect mode.
- другой способ обработки спрайтов в multiselect mode.
- в multiselect mode обработка спрайтов теперь проходит за 2 - 21 секунд (зависит от количества выбраных спрайтов).
- удалён вывод лишней информации при обработке в multiselect mode.
- теперь все выбраные спрайты в multiselect mode идут по порядку (последний символ ставится последним как положено).
- улучшенна система сохранений.
- оптимизация программы.
- разичные мелкие исправления.

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

ZX_NOVOSIB
10.05.2023, 19:43
Напомните, плиз, элегантный универсальный загрузчик тырдос/лента. Вроде встречался раньше, вроде даже там не было конструкции "IF ... THEN" (?)

Вроде даже на бейсике он был. Хотя может и на асме :v2_confu:

null_device
14.05.2023, 06:29
ZX_NOVOSIB, не знаю, насколько элегантен метод через анализ системной переменной "начала бейсик программы". Либо выполнения кодовой последовательности в бесик-строке. За счёт смещения его на 112 байт, после инициализации области системных переменных tr-dos. Сталкивался лишь с таким.

Barmaley_m
18.05.2023, 22:56
Напомните, плиз, элегантный универсальный загрузчик тырдос/лента. Вроде встречался раньше, вроде даже там не было конструкции "IF ... THEN" (?)
ASC выпускал игры с "универсальными загрузчиками". Выполнялась команда вида RANDOMIZE USR x:REM:LOAD "file" CODE

Где x - адрес машинного кода, встроенного в бейсик-программу, который определял, имеется ли TR-DOS. Если имеется - то код переходил на адрес 15619 - тем самым RANDOMIZE USR x было эквивалентно RANDOMIZE USR 15619, а дальнейший текст программы являлся "легальным" вызовом команд TR-DOS из бейсика. Если TR-DOS не было - то машинный код переставлял системную переменную CH_ADD, чтобы интерпретатор обошел команду REM, и возвращался в бейсик. После этого интерпретатор выполнял LOAD "file" CODE и грузил файл с кассеты.

Некоторая сложность была с определением адреса x, ведь он был различным для случаев наличия или отсутствия TR-DOS. Для определения правильного адреса считывалась системная переменная PROG (адрес бейсик-программы), и к этому значению прибавлялось смещение.

Вроде даже на бейсике он был. Хотя может и на асме :v2_confu:
На чистом бейсике тоже можно сделать, и пользуясь только "легальными" средствами определения наличия TR-DOS, без "инсайдерских" POKE/PEEK, опирающихся на знание прошивок бейсика и TR-DOS. По-моему в инструкции к TR-DOS был приведен способ, как следует определять наличие TR-DOS определенной командой PEEK. Дальше надо использовать IF...THEN, без "инсайдерских" POKE иначе никак. Ведь синтаксис команд загрузки с ленты и диска разный.

null_device
19.05.2023, 05:08
Некоторая сложность была с определением адреса x, ведь он был различным для случаев наличия или отсутствия TR-DOS. Для определения правильного адреса считывалась системная переменная PROG (адрес бейсик-программы), и к этому значению прибавлялось смещение.

Сложностью могло пожалуй являться дополнительное смещение бейсика ещё на +256 байт, во время выполнения команд tr-dos. Или, при подключении иной специфичной периферии. В книжке, "...для пользователей и программистов", такой указан interface 1.
В случае использования загрузчика через код вшитый в бейсик-строке, достаточно оформить по адресу со смещением +0, процедуру загрузчика tr-dos, а по адресу +112, загрузчик с ленты.
Т.о. при вызове кода с адреса +112 байт, из тела программы, за счёт смещения начале бейсика переменными tr-dos, будет запущен нужный кусок кода.

Barmaley_m
19.05.2023, 23:16
Сложностью могло пожалуй являться дополнительное смещение бейсика ещё на +256 байт, во время выполнения команд tr-dos.
Во время выполнения команд TR-DOS бейсик-интерпретатор не исполняет команды, так что это несущественно. Ну, может, в случае открытия файлов через OPEN# еще растет область каналов, но OPEN# в реальных программах и, особенно, загрузчиках, мне нигде не встречался. Подобным пользуются только авторы больших проектов на бейсике.

Или, при подключении иной специфичной периферии. В книжке, "...для пользователей и программистов", такой указан interface 1.
В СНГ Interface 1 был той еще экзотикой. Не видел ни одного "вживую", и клонов тоже не было. В мои времена никто из программистов под TR-DOS не заморачивался поддержкой возможного Interface 1.

Рискну предположить, что реальных контроллеров Beta Disk от фирмы Technology Research было произведено в десятки раз меньше, чем наших клонов на ВГ93. Так что и на Западе конфигурация "Beta disk + Interface 1" была, скорее всего, большой экзотикой.

В случае использования загрузчика через код вшитый в бейсик-строке, достаточно оформить по адресу со смещением +0, процедуру загрузчика tr-dos, а по адресу +112, загрузчик с ленты.
Т.о. при вызове кода с адреса +112 байт, из тела программы, за счёт смещения начале бейсика переменными tr-dos, будет запущен нужный кусок кода.
А вот это отличная идея. Компактно, естественно, и красиво. Снимаю шляпу!

null_device
20.05.2023, 04:41
Во время выполнения команд TR-DOS бейсик-интерпретатор не исполняет команды, так что это несущественно.

При выполнении кода вшитого в бейсик-строке, он будет также релоцирован (со сдвижкой адресации). Это стоит учитывать.

vlad-kras
22.05.2023, 18:54
адрес машинного кода, встроенного в бейсик-программу, который определял, имеется ли TR-DOS. Если имеется - то код переходил на адрес 15619 - тем самым RANDOMIZE USR x было эквивалентно RANDOMIZE USR 15619, а дальнейший текст программы являлся "легальным" вызовом команд TR-DOS из бейсика. Если TR-DOS не было - то машинный код переставлял системную переменную CH_ADD, чтобы интерпретатор обошел команду REM, и возвращался в бейсик. После этого интерпретатор выполнял LOAD "file" CODE и грузил файл с кассеты.

А если есть TR-DOS, но при этом загрузка с ленты, тогда полезет грузить с диска?

Barmaley_m
22.05.2023, 23:10
А если есть TR-DOS, но при этом загрузка с ленты, тогда полезет грузить с диска?
Да. Но для этого TR-DOS должна быть инициализирована к моменту запуска загрузчика. Большинство кассетных загрузчиков вообще не запустятся при инициализированной TR-DOS из-за смещенного адреса бейсик-программы.

Если же в бейсике выполнить RANDOMIZE USR 0 - то инициализации TR-DOS не произойдет. Можно набирать LOAD "" и грузить игру с любым ("универсальным" или обычным) загрузчиком полностью с кассеты.

Кстати, интересный вопрос - а можно ли вообще проверить, имеется ли в системе контроллер Beta-Disk, если TR-DOS не инициализирована? Ведь порты контроллера недоступны, ПЗУ TR-DOS неактивно, и следов её прошлой активности в памяти нет.

Единственный программный способ активировать порты контроллера и ПЗУ TR-DOS - это исполнить код по адресам #3Dxx. Если контроллер есть - то произойдет включение ПЗУ TR-DOS, и дальше всё понятно. А вот если контроллера нет? По адресам #3Dxx находится знакогенератор, и попытка исполнить его как код обычно заканчивается сбоем. Может быть, там есть какой-то фрагмент, на который можно выполнить переход, а потом вернуться с разным результатом в зависимости от наличия или отсутствия контроллера дисковода?

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

UPD: проверил. Знакогенератор состоит из относительно безобидных команд, среди которых нет переходов за пределы знакогенератора, бесконечных циклов, вызовов или возвратов. Из опасного - есть немного команд записи в память, которые могут "перепахать" несколько её ячеек, но и только. При правильной инициализации регистров последствия можно ограничить. Рано или поздно управление попадает на адрес #4000, а там уже можно размещать "ловящий" код.

Проверил без контроллера POKE 16384, 201: RANDOMIZE USR 15616. Сбоя не произошло, управление вернулось в бейсик: 0 OK, 0:1

Итак, алгоритм проверки следующий:
1) Размещаем на стеке адрес, где будем ловить случай наличия контроллера;
2) Размещаем по адресу #4000 код, который будет ловить случай отсутствия контроллера;
3) Инициализируем BC, DE, HL нулями или другими безопасными значениями. Надо пару раз протрассировать, что происходит при исполнении знакогенератора, и заметить, по каким адресам производится запись в память, и какие значения регистров позволят этого избежать. Ну или принять меры, чтобы запись в эти ячейки памяти не привела к сбою.
4) Выполняем переход на адрес #3D2F
5) Profit!

UPD2: Задумался, а почему я раньше нигде не встречал такого алгоритма проверки? Ответ простой. Чтобы этот алгоритм имел смысл, его нужно загрузить с кассеты. Ведь в противном случае TR-DOS окажется инициализированной, и необходимость в проверке отпадает. Но ни один владелец дисковода в здравом уме не грузит ничего с кассеты. Разве только с целью сохранить загруженное на диск и забыть "кассетную" жизнь, как страшный сон.

Bedazzle
23.05.2023, 09:49
UPD: проверил. Знакогенератор состоит из относительно безобидных команд

У друга был заводской клон с изменённым шрифтом. Так что безобидность - она относительная.

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


Но ни один владелец дисковода в здравом уме не грузит ничего с кассеты.

Это если есть безглючная дисковая версия.

vlad-kras
23.05.2023, 14:48
Но ни один владелец дисковода в здравом уме не грузит ничего с кассеты. Разве только с целью сохранить загруженное на диск и забыть "кассетную" жизнь, как страшный сон.

А если это фирменная игра с очень интересными эффектами именно для загрузки с ленты, то есть человеку просто приятно смотреть на ленточную загрузку? Тем более сейчас для эмуляторов flash loading с "ленты" вполне удобно работает.

null_device
23.05.2023, 20:02
А если есть TR-DOS, но при этом загрузка с ленты, тогда полезет грузить с диска?

Для функций, выходящих за пределы чего-то большего, чем загрузка программы нет сложности, чем предусмотреть меню, как в любой системной программке.
Как вариант: заиметь переменную указывающую способ загрузки.

Barmaley_m
24.05.2023, 22:38
У друга был заводской клон с изменённым шрифтом. Так что безобидность - она относительная.
Любые изменения ПЗУ чреваты. Я в свое время исследовал много программ на предмет того, почему они несовместимы с измененным ПЗУ. Доходило до смешного. В одной защите вызывалась процедура рисования линии из ПЗУ, и защита зависела от значения регистра R после отрисовки линии. При измененных алгоритмах рисования такая защита упадёт. В других программах проверялся обработчик NMI из ПЗУ, для защиты от взлома. Драйвера клавиатуры полагались на неизменное положение таблиц скан-кодов в ПЗУ. Кто-то шифровал программы, ксоря их с фрагментами ПЗУ. И так далее. В конце концов я пришел к выводу, что безопасных изменений в ПЗУ не бывает. Если нужно сохранить совместимость со всем софтом - то ни одного байта прошивки бейсика менять нельзя.

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


А если это фирменная игра с очень интересными эффектами именно для загрузки с ленты, то есть человеку просто приятно смотреть на ленточную загрузку?
Я один из эстетов ленточной загрузки, было несколько игр с любимыми эффектами при загрузке. В эмуляторе наслаждался этими эффектами. А за годы своей "дисководной" жизни с реалом (1993-1997) грузил что-то с ленты только для переброски на диск.

Тем более сейчас для эмуляторов flash loading с "ленты" вполне удобно работает.
При развлечениях с эмулятором главное - то, что не надо доставать и подключать, а потом прятать на место, магнитофон и кассеты.

null_device
26.05.2023, 07:00
Barmaley_m, цимес ещё и в том, что дешифрация адреса окна "включения" BDI, в оригинале (15360-15615) и отечественной кальке (15616-15871), отличалась

goodboy
26.05.2023, 10:00
адрес окна отличался в версиях ранняя/поздняя, а не в оригинале/кальке

null_device
26.05.2023, 11:48
goodboy, возможно.
С отечественными вариантами схемы на "ранней" дешифрации, попросту не сталкивался. И тем не менее, сути это не меняет.

Conan
28.05.2023, 10:59
я пришел к выводу, что безопасных изменений в ПЗУ не бывает. Если нужно сохранить совместимость со всем софтом - то ни одного байта прошивки бейсика менять нельзя.О возможных проблемах совместимости на измененных прошивках я впервые узнал в 1989 году. Воспринял это как аксиому и не использовал модифицированные ПЗУ (ни при ремонте чужих клонов, ни при разработке собственного). Но конкретики - что именно не совместимо (списка игр/загрузчиков) не встречал. Может где-то такой имеется? Или хотя бы несколько названий (для примера).

P.S. Понятно, что степень "модификации" прошивок была разной, он замены (С) до переписывания загрузчиков с ленты. Поэтому интересны именно те игры, которые наиболее сильно зависят от содержимого ПЗУ.

vlad-kras
28.05.2023, 16:56
Тоже интересен список таких игр. Читал только про несовместимость некоторых игр для 48К и меню загрузки от 128К, там достаточно было сделать ресет на 48К и дальше нормально должно быть.
Фирменные загрузчики или


В одной защите вызывалась процедура рисования линии из ПЗУ, и защита зависела от значения регистра R после отрисовки линии. При измененных алгоритмах рисования такая защита упадёт. В других программах проверялся обработчик NMI из ПЗУ, для защиты от взлома.

А это все защита от взлома и отладки именно при самой игре или просто от копирования? Для фирменных лент не о таких подходах не слышал. Или это уже пираты так защищают честно спираченные игры?

Bedazzle
28.05.2023, 18:00
Или это уже пираты так защищают честно спираченные игры?

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

Spectramine
28.05.2023, 20:13
О возможных проблемах совместимости на измененных прошивках я впервые узнал в 1989 году. Воспринял это как аксиому и не использовал модифицированные ПЗУ (ни при ремонте чужих клонов, ни при разработке собственного). Но конкретики - что именно не совместимо (списка игр/загрузчиков) не встречал. Может где-то такой имеется? Или хотя бы несколько названий (для примера).

P.S. Понятно, что степень "модификации" прошивок была разной, он замены (С) до переписывания загрузчиков с ленты. Поэтому интересны именно те игры, которые наиболее сильно зависят от содержимого ПЗУ.


Большинство неработающих игр не работало из-за использования свободного места в ПЗУ 48к как адреса векторов прерываний (Bomb Jack, Rambo 3). Соответственно, ПЗУ, использующие эту область, с такими играми не дружили (правда, это можно было обойти на машинах со стабильной шиной, оставляя FFFF на границах 256-байтных блоков (по адресам 3xFF-3y00)) (Кстати, та же проблема была с фирменным ПЗУ +3_, вроде в дальнейшем пофиксили).

Были и игры, использующие код ПЗУ для расксорки, но намного меньше. Насчет фирменных не скажу, а на взломанных бывало. И ещё были игры, проверяющие свободное место ПЗУ, и на основании того, FF там или нет, принимали решение, играть музыку на бипере или на AY (фирменные 128е используют свободное место ПЗУ 48к) - Exolon, Golden Axe. Т.е. на модифицированном ПЗУ 48к без AY в таких играх не было музыки, или вообще звуков.

Conan
28.05.2023, 21:20
Bomb JackОдна из моих любимых игр... хотя табличка со счетом там не сохранялась, но резались в нее активно. Был такой случай: на свадьбе у одноклассника перед тем, как отправляться в ЗАГС разыграли в несколько участников партеечку... я набрал какой-то рекордный счет, уже хотел записаться, а тут жених подходит и говорит: дай я запишу Алесю (так невесту звали) на первое место, это будет ей подарок))))))

P.S. Конкретика (хотя бы несколько названий) это уже что-то. Спасибо!

Barmaley_m
28.05.2023, 22:02
Тоже интересен список таких игр.
С этим напряг. Я помню только Bomb Jack, который ставил регистр I на область ПЗУ, заполненную FF'ами, и обработчик по адресу #FFFF. В бейсик-Орель это место было занято русским шрифтом и прочими изменениями, так что управление на адрес #FFFF по прерываниям не попадало, и происходил сбой. Остальные игры и программы поименно не помню. Давно это было.

А это все защита от взлома и отладки именно при самой игре
Да, это была защита от взлома. Конкретно процедура линии применялась, если склероз не изменяет, в какой-то из топовых демок с Enlight 96.

Или это уже пираты так защищают честно спираченные игры?
Пираты всегда защищали честно спираченные игры. Но не от копирования, а просто от взлома и изменения авторства взломщика. Простейшие защиты (одна-две ксорки) встречались у S.S. Captain. У Bill Gilbert иногда было и посложнее (я описывал недавно в смежной теме защиту "* Loader *" от Bill Gilbert, которая оказалась для меня самой трудной). Средне-высокого уровня защиты встречались у Nicolas Rodionov. В демках и Cracktro от Max Iwamoto была интересная защита в виде виртуальной машины, программа для которой хранилась на стеке. Весь код состоял из коротких процедур, каждая из которых заканчивалась RET (реализация команд виртуальной машины) и списком последовательности их вызова, размещенном на стеке (программа виртуальной машины). Там и циклы были, и все остальное. Было интересно ломать.

Вообще наличие защит во взломанных играх представляло одну из главных трудностей при адаптации их на диск. Ведь эти защиты приходилось ломать. Хороший обзор трюков (вплоть до трудных) имеется в книжке Николая Родионова "Адаптация программ к системе TR-DOS". В этой же книжке он вводит термин "ксорка", который с тех пор широко вошел в жаргон спектрумистов.

Bedazzle
29.05.2023, 23:56
В демках и Cracktro от Max Iwamoto

Ни Скорпиона с теневиком, ни даже банальной кнопки мэджик у меня не было, поэтому извращался как мог. :)
Чтобы сломать какие-то релизы MKHG засовывал свой перехватчик в сектор на диске сразу после шифрованного блока лоадера. Часто картинка была пакованной, и сохранялась вместе с депакером. Лоадер не проверял, что загружено с диска, и тупо запускал мой код, который делал своё чёрное дело...

0xDEAD
30.05.2023, 16:59
У меня был какой-то непонятный биос :v2_dizzy_punk: (о нём здесь где-то писали на форуме, не смог сходу найти тему - ну и ладно) - копирайт был... ну точно не 1982 год, попозже, и был встроен какой-то стрёмный теневой монитор, с которым совершенно непонятно было как работать, потому что горячие клавиши были неизвестны.
Так вот: не скажу, что прямо всё не работало, но многие игры, действительно, не работали. Как ни странно, прошло, как только нашёл человека с программатором, и прошил стандартную ОС.

AndTorp
01.09.2023, 02:48
Здравствуйте. Не могу вспомнить как сделать, чтобы, во время загрузки с магнитофона, на экране вообще не появлялись надписи "Program:", "Bytes:".

creator
01.09.2023, 03:50
чтобы, во время загрузки с магнитофона, на экране вообще не появлялись надписи "Program:", "Bytes:"
POKE VAL "23739", CODE "o"

null_device
01.09.2023, 07:04
creator, вроде как ест одна тонкость:

Этот способ потенциально опасен тем, что если программа использует стандартные каналы "Спектрума" (данные из таблицы CHANS) для вывода своих собственных сообщений, и при этом не проверяет эту таблицу и не устанавливает ее содержимое, то возможны неприятности. В таком случае можно в начале программы-загрузчика сохранять где-либо значение PEEK 23739, а после загрузки всех блоков программы с заголовками восстанавливать его.

AndTorp
01.09.2023, 20:35
creator и null_device, благодарю.

Только вопрос: POKE VAL "23739", CODE "o" не нарушит работу TR-DOS?

0xDEAD
01.09.2023, 20:55
Да в чем же такая трудность просто ПОПРОБОВАТЬ?

ZEman
03.09.2023, 08:30
Rararura 2.1

новая версия моей программки редактора.
в основном изменения коснулись режимов big mode и copy symbol mode.
также программа стала работать немного быстрее.

список изменений:

- дабавленно копирование и вставка символов в copy symbol mode.
- добавленно удаление символов в copy symbol mode.
- добавленно сохранение любого из 3 шрифтов на ленту, в copy symbol mode.
- добавленно удаление любого шрифта в copy symbol mode.
- обработка в режиме complete стала быстрее на 90 секунд.
- изменена система вызовов шрифтов.
- удалены некоторые метки в снимках памяти.
- оптимизация программы.

во вложении сама программа в виде снапшота и кассетного образа:79444
также прикладываю новую (дополненную) версию мануала: https://disk.yandex.ru/i/G34_wVya3X1Jcw

ZEman
03.11.2023, 08:16
подскажите пожалуйста кто-нибудь.
я знаю что системный шрифт в пзу спектрума 48к располагается по адресу 15616 занимая там 768 байт.
а по какому адресу располагаются вот эти символы:
79718
они выводятся в графическом режиме.

Black Cat / Era CG
03.11.2023, 08:54
А они похоже не хранятся в ПЗУ прямо в виде символов, формируются при выводе.

ZEman
07.11.2023, 18:19
Rararura 2.1.1

обновление программы.
в основном измения были в copy symbol mode и в редакторе UDG символов.

список изменений:

- выбор одного из трёх режимов в big mode после выбора в текстовом редакторе paste text to big mode.
- добавленно вставка UDG символов в copy symbol mode.
- добавлен индикатор для копировании символов в copy symbol mode.
- небольшой прирост скорости в текстовом редакторе.
- убран вывод лишней информации в редакторе UDG (информация теперь выводится только по нажатию клавиши "D").
- исправленна ошибка с выводом надписей результата в редакторе UDG.
- теперь модуль начинается со строки 8300.
- оптимизация программы.

во вложении снапшот и кассетная версия программы.

vlad-kras
30.12.2023, 10:09
Можно ли уменьшить область печати с 22 строк до 16, чтобы потом при скроллинге нижняя треть экрана оставалась нетронутой? Если увеличить число строк служебной области с 2 до 8, то печать происходит на 16 строк, но все равно далее скроллинг низ экрана портит.

ZEman
26.03.2024, 13:31
Rararura 2.1.2

новая версия программы редактора.
в основном изменения коснулись режимов data symbol mode и copy symbol mode.
также была проведена оптимизация программы и некоторые мелкие улучшения.

список изменений:

- добавленно сохранение UDG символа из data symbol mode.
- добавленно отмена сохранения UDG символа в data symbol mode.
- исправленна ошибка с неправльным цветом сетки в data symbol mode.
- исправленны ошибки с выбором UDG символа в copy symbol mode.
- переименовал data symbol в UDG info.
- оптимизация программы.

во вложении снапшот и кассетная версия программы, и все 4 модуля.
мануал можно скачать по отдельной ссылке: https://disk.yandex.ru/i/G34_wVya3X1Jcw

перезалил архив с программой.

ZEman
03.01.2025, 09:07
Rararura 2.1.3

обновление.
исправлена одна ошибка в copy symbol mode, изменены индикаторы и проведена оптимизация программы.

список изменений:

- изменён индикатор выбранных символов для Multiselect в copy symbol mode.
- изменён индикатор обработки спрайтов в big mode (теперь это заполняющаяся полоса).
- теперь закончить выбор символов для Multiselect можно как клавишей "М" так и "N".
- исправленна ошибка с выбором UDG символа после копирования в copy symbol mode.
- оптимизация программы.

во вложении снапшот и кассетная версия программы.
мануал по этой ссылке https://disk.yandex.ru/i/Hp_Q32Z-STUU5A.