Поганые кавычки при вводе символьной переменной, через оператор INPUT, убираются добавлением команды LINE. :)
Вид для печати
прошу помощи ибо никак не выходит.
есть програмка - текстовый редактор (листинг и снапшот прилагается).
и всё бы хорошо, всё прекрасно работает.
но есть маленький недочёт который меня просто бесит.
курсор перемещается с помощью клавиш стрелок и любая другая клавиша ставит символ на экране.
если перемещая курсор по экрану, зажать одну клавишу например стрелку влево - курсор бежит влево.
если теперь не отпуская клавиши нажать другую клавишу стрелку то на экран будет выводиться одна из цифр (5 6 7 или 8).
как это можно обойти ?
как сбросить байт отвечающий за зажатую клавишу SHIFT чтоб понималось только значение нажатой стрелки ?
ZEman, если все это происходит на реале, это какая-то особенность именно вашего "железа". Реализация узла контроллера клавиатуры, или непосредственно пленок в ней. Т.к. при опросе через функцию INKEY$, при одновременном нажатии двух клавиш "базовой матрицы", она возвращает "пустой" аргумент (значение "ноль").
происходит это всё на эмуляторе, Я в основном использую ZX SPIN.
две клавиши (стрелки) надо зажать всего лишь на секунду, затем одну отпустить а вторую продолжать удерживать.
после этого будет печататься одна из цифр - 5, 6, 7 или 8 хотя удерживается стрелка.
вставлял в программу такую строчку:
7602 строчку делаем например 7605ой
7603 PRINT #0; AT 1,0;P;" "
и видим что при этом значение ставится 53 - 56 (код цифр 5 - 8).
ZEman, не все эмуляторы "одинаково полезны". Скоре всего, это "баго-фича" реализации опроса клавиатуры.
Мне, повторить подобное в анреале и спектакуляторе - не удалось.
Я вот тоже ща проверил действительно этот баг тока в 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
кому верить то ?
ZEman, у меня, на реальных клонах - работало, именно как на спектакуляторе и анреале.
Может, что-то не совсем правильно настроено в параметрах эмуляции клавиатуры?
Курсорные клавиши, это как бы одновременно зажатие двух клавиши: SHIFT и четыре кнопки верхнего полуряда. При этом SHIFT должен нажиматься первым, иначе и полезут цифры.
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
Доброго времени суток. Возникло легкое непонимание. При записи В системную переменную 23607, для выбора другой таблицы символов, мы получается, просто сдвигаем адрес, с которого начинается чтение кодов символов? Кроме того, как я понял, символы с кодами 0-31 переопределить нельзя, но в общей таблице адресов альтернативного набора символов их все равно надо учитывать. Я прав? Прошу извинить, если вам мои вопросы кажутся несколько... простыми. Но тут вопрос правильности понимания мною системы. Спасибо.
В общем случае - да, бейсиковские процедуры ПЗУ берут адрес знакогенератора из переменной (23606/607).
Если пользоваться процедурами ПЗУ - да, эти коды (часть) интерпретируются как управляющие.
Если точнее - адрес в переменной 23606/607 уже содержит смещение +256 от "нулевого" символа, т.е. первые 32 пропускаются.
Соответственно, загружая фонт по условному адресу #С000, в переменную нужно ложить #BF00. Это если фонт неполный, разумеется.
Если же пользоваться своей процедурой печати и набор полный (с нулевого символа), то этой продедуре дается реальный адрес фонта,
а печатать можно хоть все 256 символов, что стандартная процедура RST#10 сделать не позволит.
просто поржать
https://youtu.be/4L_gdmcYbvw
такие вот игрухи писал лет в 14 когда ходил на кружок по программированию...
сейчас вот увидел на ютубе что кто то пытается что то писать и решил вспомнить...
а где нить на форуме есть раздел простых игр на бейсике ? без 1000 строк бесконечного набора...
Зацепило, да? Хех, я старался. Вот тебе книжка с играми на BASIC. Игры в большинстве своем, правда, так себе... Типа топора гоняющегося за чуваком, но есть и интересные. Особенно мне нравится как реализован опрос клавиатуры в некоторых играх - через опрос порта. https://zxpress.ru/book.php?id=45 правда в большинстве своем они подразумевают русифицированный бейсик. Но мне кажется это не критично ) Кстати в редакторе номера строк считаются исключительно по цифрам, как и в оригинальном Spectrum-Basic. Переносы без номеров просто для удобства чтения кода.
Некоторые программы в книге, кстати, работают несколько криво
ну на асме да, а на бейсике все таки хочется простоты...
да нет, просто написал на ютубе мол долго пишите игру, там делов то на 20 строк, вот и взяли меня на слабо :-))
дольше эмулятор искал нормальный, а то уж лет 25 прошло как спектрум видел... совсем не помню набор на его клавиатуре - а в эмуляторах вечно какие то виртуальные клавы оторванные от PC и набрать что то более менее объемное не реально...
вот и подумал потом - что может где есть тема какая нить с простенькими играми... чтобы за 10 минут набрать можно было бы...
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 режим.
- исправленна ошибка с выставлением одинакового цвета для курсора и фона в меню выбора символа.
- оптимизация программы.
такой вопрос появился:
правильно ли Я понимаю что из бейсика Спектрум 48к нельзя записывать (загружать) информацию с дисков ?
нет никаких способов ?
а как ?
я читал на zxpress.ru что вроде нельзя такое без тр-доса.
пробовал набрать типа RANDOMIZE USR 15619: REM : LOAD ""CODE 64660,704 программа просто зависала.
значит это только в 128к версии спектрума можно и без тр-доса никак.
а где можно взять тр-дос для 48к версии ?
чёт я не нахожу такого.
тр-дос один и тот же.
- - - Добавлено - - -
Вы же в эмуляторе.
этот чтоли ? TR-DOS+ by Bredsoft'96 https://vtrd.in/system/TR-DOS+.zip
смотрю на виртуал трдос.
- - - Добавлено - - -
там scl образ который в 48к никак.
О_о Зачем образ? Если эмуль, то надо настроить 48+тр-дос (а проще просто перейти из меню пентагона в бейсик 48 и все).
А если железка, то там либо есть BDI, либо нет.
Это как миф про то, что на 48 не может быть AY.
Лет 5 просидел на Форум БК-011 Турбо, а это именно 48, с YM и BDI.
- - - Добавлено - - -
А может просто бесик-прога съела всю память, поэтому попытка вызвать команду тр-дос подвешивает спек?
Надо попробовать из голого барсика.
ZEman, tr-dos - не более, чем название программной части "карточки расширения" Beta Disk Interface. При его физическом отсутствии (в т.ч. конфигурации эмулированной машины), вызов команд tr-dos, через стандартные точки - равносильно попытке исполнения некоего кода из ПЗУ в области знакогенератора. Со вполне предсказуемым итогом. ;)
- - - Добавлено - - -
А вот, после подключения BDI, при попытке выполнить код из определенного диапазона адресов - стандартное (или, не совсем) ПЗУ спектрума, подменяется ПЗУ tr-dos. По завершению исполнения подпрограмм, все возвращается на прежнее место.
Тут уже поднимался вопрос как из кода исполнить бейсик команду.
Предложенный вариант несколько не устроил, хотелось запускать не программу с номерами строки и т.п. а просто один или несколько операторов.
Покопавшись в пзу, пришел к такому решению:
возможно кому-то пригодитсяКод:;инициализация переменных для старта программы в 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
ну дело ваше, не хотите не копируйте, а мне без копирования никак
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ых она была бы востребована, а сейчас это так, ради интереса.
надеюсь что возможно смогу позже ещё обновить данную прогу, но шансов уже мало, ибо маловато свободного места.
Напомните, плиз, элегантный универсальный загрузчик тырдос/лента. Вроде встречался раньше, вроде даже там не было конструкции "IF ... THEN" (?)
Вроде даже на бейсике он был. Хотя может и на асме :v2_confu:
ZX_NOVOSIB, не знаю, насколько элегантен метод через анализ системной переменной "начала бейсик программы". Либо выполнения кодовой последовательности в бесик-строке. За счёт смещения его на 112 байт, после инициализации области системных переменных tr-dos. Сталкивался лишь с таким.
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 (адрес бейсик-программы), и к этому значению прибавлялось смещение.
На чистом бейсике тоже можно сделать, и пользуясь только "легальными" средствами определения наличия TR-DOS, без "инсайдерских" POKE/PEEK, опирающихся на знание прошивок бейсика и TR-DOS. По-моему в инструкции к TR-DOS был приведен способ, как следует определять наличие TR-DOS определенной командой PEEK. Дальше надо использовать IF...THEN, без "инсайдерских" POKE иначе никак. Ведь синтаксис команд загрузки с ленты и диска разный.
Сложностью могло пожалуй являться дополнительное смещение бейсика ещё на +256 байт, во время выполнения команд tr-dos. Или, при подключении иной специфичной периферии. В книжке, "...для пользователей и программистов", такой указан interface 1.
В случае использования загрузчика через код вшитый в бейсик-строке, достаточно оформить по адресу со смещением +0, процедуру загрузчика tr-dos, а по адресу +112, загрузчик с ленты.
Т.о. при вызове кода с адреса +112 байт, из тела программы, за счёт смещения начале бейсика переменными tr-dos, будет запущен нужный кусок кода.
Во время выполнения команд TR-DOS бейсик-интерпретатор не исполняет команды, так что это несущественно. Ну, может, в случае открытия файлов через OPEN# еще растет область каналов, но OPEN# в реальных программах и, особенно, загрузчиках, мне нигде не встречался. Подобным пользуются только авторы больших проектов на бейсике.
В СНГ Interface 1 был той еще экзотикой. Не видел ни одного "вживую", и клонов тоже не было. В мои времена никто из программистов под TR-DOS не заморачивался поддержкой возможного Interface 1.
Рискну предположить, что реальных контроллеров Beta Disk от фирмы Technology Research было произведено в десятки раз меньше, чем наших клонов на ВГ93. Так что и на Западе конфигурация "Beta disk + Interface 1" была, скорее всего, большой экзотикой.
А вот это отличная идея. Компактно, естественно, и красиво. Снимаю шляпу!
Да. Но для этого 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 окажется инициализированной, и необходимость в проверке отпадает. Но ни один владелец дисковода в здравом уме не грузит ничего с кассеты. Разве только с целью сохранить загруженное на диск и забыть "кассетную" жизнь, как страшный сон.