в памяти кроме программы на-бейсике и UDG что-то ещё есть ?
(у меня сложилось впечатление что ты оперируешь цифрами наугад)
Вид для печати
я уже выкладывал прогу, на прошлой странице.
clear у меня там стоит на 61829.
кроме самого бейсика в ту область заносятся:
screen: (так я назвал две служебные строки в которых может находится любая графика) размер 512 байт, начинается с 61830.
font: три шрифта из art studio (любые догружаются) - начинаются с 62350 по 768 байт каждый. заканчиваются на 64658.
text: текст набранный в редакторе, полный экран с 0 по 21 строчки - начинается с 64660, длина 704 байта.
udg: udg-символы 65368 длина 168 байт.
обновил прогу до новой версии, (пока ещё тестирую её, потому и не выкладываю).
чую что места практически нет, впритык уже всё, вот и пытаюсь вычислить сколько байт ещё есть.
да, забыл добавить, размер проги теперь 36689 байт.
ZEman, читайте переменные VARS и PROG. Вычтя из первого, второе - унаем длину бейсик программы. Непосредсвенно свободная область после бейсик переменныех нчинается со значения WORKSP. Или, наберите PRINT 65536 - USR 7962, вроде, как должно показывать количество свободной памяти в байтах.
goodboy, я уже советовал ТС, отказаться от многобуквенных переменных и по возможности использовать одни и те же локальные переменные.
Вопрос в том - хватит ли свободной памяти для его работы.
ZEman, могу на досуге вручную "перебрать" вашу программу исключив "лишние" операторы и попытаться уменьшить обьем листинга.
точечный оптимизатор сокращает прогу примерно на 1600байт
и самое главное в отличии от VAL незамедляет обработку строк
http://savepic.ru/11405387.png
После работы попробую уменьшить размер проги, даже байт 200-300 прилично увеличит продолжительность работы проги.
Можно ещё конечно run или сlear куда-то добавить, но боюсь что тогда все переменные обнулятся.
Вобщем буду стараться оптимизировать.
А разве Remы так много занимают ?
:v2_dizzy_aaaaa
Я их использую для разделения программы на части чтоб не путаться, где, что.
каждая буква текста - один байт (их набегает 1231 символ), плюс сами REMы (113 штук), плюс бейсиковская информация по каждой строке - номер, длина, возврат каретки (113 штук * 5 байт = 565)
итого 1909 байт
чутка наврал, что больше 2кб :)
-----
вот это тоже на машкоде реализовать совсем легко, места займёт меньше, а выполняться будет мгновенно:
цикл копированияКод:4002 CLS
4003 PRINT INK 0; FLASH 1;AT 3,3;"Please wait 40 seconds !"
4005 LET adr=20672: LET peek=0: LET ra=61830
4007 LET di=adr+63
4009 FOR g=adr TO di
4011 LET peek=PEEK ra
4013 POKE g,peek
4015 LET ra=ra+1
4017 NEXT g
ну и вызов процедурки через rand usr val "...." - 10 байт,Код:LD HL, 61830 ; 3 байта
LD DE, 20672 ; 3 байта
LD BC, 64 ; 3 байта
LDIR ; 2 байта
RET ; 1 байт
итого: 12 байт
что в итоге даст размер меньший, чем бейсиковское сообщение "подождите 40 сек"
ну чтож, по сравнению с тем что было мне удалось освободить 1090 байт (убрал текст из REM коментариев).
думаю этого хватит, возможно позже ещё проведу кое-какую оптимизацию.
вот что получилось.
Rararura 1.5.1 версия:
- оптимизация.
- исправил досадную ошибку (удивляюсь как я её раньше не замечал) с отрисовкой сетки 8х8 для символов.
- добавил сохранение снимка памяти (записывается всё вместе - screen, udg-symbols, text, fonts) в один файл на ленту, размером 3706 байт.
- сохранение снимка памяти (при вопросе "save udg symbols ? y/n" нажмите "*")
- загрузка снимка памяти (при вопросе "Load udg symbols y/n" нажмите "*")
- очистка (удаление) всех udg-символов.
- создание нового шрифта из udg-символов (можно потом использовать хоть в art studio, хоть где-то ещё).
чтобы создать новый шрифт вам придётся использовать пять ! наборов udg-символов по 168 байт, созданных вами или загруженных откудато ещё.
вроде-бы это всё, дальнейшее развитие программы наверно бессмысленно (или невозможно).
хотя, всякое бывает, если удастся освободить места намного больше, то...
Похоже, где-то нелатиницей сообщения написаны.
https://i.imgur.com/PrYy9py.png
Странно, если смотреть через эмулятор в снапшоте или тапке то такой ошибки в тексте нет.
Видимо здесь виноват Punto switcher - очень полезная, хотя иногда и вредная прога.
- - - Добавлено - - -
Мне интересно вот что.
Объясню на простом примере.
Допустим в какойто проге используется 10 переменных (let, for и.т.д.)
Каждая из этих переменных оперирует числами от 1 до 100.
Там установлен clear - допустим 60000.
а теперь собственно вопрос - 10 переменных по (максимум) 100 байт - это в пределах одного килобайта получается.
Так-вот будет там свободное место всегда, в любом случае уменьшаться до конца (out of memory) или же место будет отедаться только в определённом куске памяти в пределах одного килобайта ?
для хранения чисел в-памяти используется 5ти байтная форма.
любая переменная в памяти займет (5+длина её имени).
на этом способе основана экономия памяти и защита/запутанность программ.
на экране видим print usr 0
а в пятибайтной форме скрыто совсем иное число.
(выше я показал как можно все цифры скрыть точками)
В твоей формулировке "до конца". Текст программы и переменные хранятся в общем пространстве памяти, отдельных лимитов для переменных нет. Область переменных идет за текстом программы и двигается к старшим адресам при добавлении новых строк. При выполнении DIM, LET, FOR, INPUT BASIC выполняет присваивание и, если находит переменную подходящего типа, копирует новое значение поверх старого, если не находит - создает новую переменную (и увеличивает занятую ими область вплоть до out of memory). Крмое того, за областью переменных следует так называемая рабочая область, в которой хранятся значения переменных сложных типов (строки, массивы). Так что out of memory может случаться при присваивании даже если переменная уже есть, но стала "больше" (строка длиннее, массив больше).
Эмм..
То есть, если я правильно понял, память в процессе работы любой программы всёравно неизбежно уменьшается, так ?
Но в таком случае, уменьшение размера любой программы бессмысленно, всё-равно в итоге будет "out of memory".
Как-же тогда поступают другие, есть способ очистки данных ?
Можно конечно использовать clear или run, но тогда все переменные полетят к чертям.
Кстати, чутка ускорить (особенно в циклах) работу бейсиковой программы можно,
если использовать
а) однобуквенные переменные
б) переменные в верхнем регистре
в) правильно расположив порядок декларации переменных (чтобы часто используемые находились быстрее)
г) в циклах использовать подмену системной переменной, которая хранит адрес следующей строки (подробности тут)
После работы приду, повожусь ещё с программой.
Уберу не только комментарии но и сами remы - это даст ещё байт 400, а потом надо будет сокращать некоторые переменные до одного символа.
Во всех for буду по возможносьти использовать какую-то одну букву.
Но, я думаю и так работы программы хватит на долго.
Помимо
могу добавить, что
,
а, если строка или массив становится короче (например, let a$=""), то память освобождается.
- - - Добавлено - - -
Это круто сэкономит память - переменная for занимает в памяти 19 байт. Вообще, почитай про струкруру всякого в BASIC'е вот тут ("Формат хранения текста программы на Бейсике", совсем немного, но доступно, там же и про переменные). Поймешь что сколько байт занимает и на чем можно сэкономить. Предыдущая глава тоже, кстати, пользительная, она рассказывает что где в памяти лежит.
Да я уже понял что forы довольно много занимают, но они очень удобные, чем их ещё заменишь.
С помощью let s=s+1.... И.т.д. медленно бывает.
А никакого способа нет чтоб безболезненно очищать память ?
Чтобы переменные нужные не дохли и память хоть немного освобождалась.
Зачем например в памяти откладываются операции по выполнению фором или letами, они ведь уже прошли.
ZEman, возможно уже писал, но повторюсь. При написании большой программы на бейсике, стоит использовать однобуквенные переменные и по возможности один и те же имена для локальных подпрограмм. Чтобы не возникало ситуации, когда переменная задействуясь в какой-либо части программы, более нигде не используясь, занимала память.
В бейсике, все переменные являются глобальными. Будучи, хоть один раз заданной, к ней можно обращаться в любой момент выполнения программы.
Значение циклов, может использоваться как возврат в тело цикла, если в процессе его выполнения, был осуществлен переход оператором GOTO или GOSUB из тела цикла. Опять же - значение переменной цикла может понадобиться в случае "аварийного" выхода из него.
sorry, что так долго не выкладывал, простыл, сижу с температурой :(
лан, лучше позже чем никогда.
Rararura 1.5.1
-оптимизация программы.
-удалил все Remы кроме двух с копирайтами.
-все forы теперь for g=...
-удалил несколько бесполезных строк.
теперь программа занимает вместо 36689 байт, всего 34808 байт.
также во вложении необходимые для работы программы файлы.
Ну это тоже, здесь ведь ничего нового нет кроме оптимизации.
уговорил :)
незнаю что ещё можно придумать, пока додумался лишь до..
Rararura 1.6.0 (beta)
- отделил от программы clear и poke 23658,8 в загрузчик, после которого загружается сама программа.
- освободилось ещё 40 байт :)
далее буду сокращать переменные, может ещё что придумаю.
это пока очень сырая бета-версия.
есть маленькая непонятка:
загружаю лоадер, затем гружу саму прогу, в самой программе нет автостарта.
в конце загрузки программы мне выдаётся "С nonsense in BASIC, 2:1"
хотя после команды run всё отлично работает.
так-же если я загружаю после лоадера программу с автостартом на 2 строку - ошибки нет.
в чём проблемма ?
хе-хе, а у emuzwin походу точность эмуляции похуже будет чем у zxspin.
в emuzwin после загрузки, курсор всё-равно стал обычным, в zxspin нет.
zxmak 2 тоже выдал ошибку и сохранил курсор в "С".
а откуда бейсику знать о подмене текста программы ???
он тупо выполняет LOAD "" и переходит к изучению очередного байта,
а там скорее всего что-то типа =0
вот он и выдаёт ошибку
по-хорошему надо делать принудительное переключение на 48ое ПЗУ,
в 128ом прога выглядит странновато
(там пара UDG зарезервирована под токены)
два дня потихоньку вычищал прогу, получилось весьма неплохо.
Rararura 1.6.0
- clear и режим "С" курсора вынесены в загрузчик.
- освободил ещё 503 байта места.
- подавляющее большинство переменных переведены в однобуквенные формы. также все forы теперь for g=...
- исправил пару мелких ошибок в main menu.
- программа теперь работает немного быстрее чем раньше.
проверил работоспособность, довольно долго делал всё что можно, out of memory - не появился и места ещё прилично было.
во вложении сама прога и файлы которые можно догружать (их можно самому создать сколько угодно).
как теперь получилось, что скажете ?
- - - Добавлено - - -
вот, чёрт.
заметил тока щас мелкую ошибку.
забыл в tap версии в бейсик-загрузчике имя сменить, из-за чего не грузилась программа.
перезалил архивчик.
всё, финальная версия проги.
из-за того что болел занимался очень немного, но вот что получилось.
Rararura 1.6.0a
- освободил ещё байт 200 места.
- исправил небольшую ошибку в отрисовке шрифтов.
- ещё больше переменных перевёл в 1-буквенный вид.
- программа стала работать немного быстрее.
всё на несколько раз проверил, вроде больше ошибок нет.
незнаю можно-ли тут что-то ещё улучшить.
помаленьку пишу мануал к проге, через несколько дней выложу.
есть вопросик, ни у кого из ранее скачивающих эту прогу не сохранился случайно архив что я выкладывал на 4 странице 04.08.2016 (сообщение №33) ?
только такое есть:
https://i.imgur.com/AwhsibS.png
всё-таки ещё раз обновил прогу и наконец выкладываю здесь.
Rararura 1.6.1
немного изменил отрисовку больших спрайтов.
исправил ошибку в copy symbol mode.
слегка изменил меню about.
добавил memory test (показывает сколько памяти осталось).
небольшая оптимизация программы.
добавил мануал к программе.
в вложении кроме самой программы находится мануал и различные загружаемые файлы для примера.
наверное это финальная версия.
обновил прогу ещё раз.
Rararura 1.7.0
- добавлена загрузка внешнего модуля.
- улучшен memory test.
- улучшенна обработка спрайтов в big mode.
- улучшенна очистка экранов программы.
- оптимизация программы.
о нововведениях:
добавление модуля в программу позволит использовать любую подпрограмму в основной программе.
грубо говоря это как в конструкторе, в основную часть можно встроить что-то новое.
есть некоторые ограничения:
программа внутри модуля должна начинаться со строки 8500 и может длиться до строки номер 8799 включительно.
выход из модуля желательно делать на строку номер 5.
модуль должен иметь размер до 2.5 кб НЕ БОЛЕЕ !
в противном случае памяти может не хватить.
оптимизировал программу настолько, насколько это вообще возможно.
перевёл ещё больше переменных в однобуквенный вид.
во вложении сама программа файлы для примера и мануал.
снова обновление.
Rararura 1.7.1
- исправлена ошибка при работе с модулем.
- мелкие исправления и оптимизация.
провёл большую оптимизацию программы.
убрал различные лишние строчки, вывод пустых линий сделал компактней.
в программе больше не осталось ни одной переменной с более чем двумя знаками.
освободил 530 байт места, программа стала работать заметно быстрее.
не знаю, можно ли ещё как-то оптимизировать программу, по-моему я выжал из неё максимум.
во вложении сама программа файлы для примера и мануал.
я что-то нифига понять не могу, почему так.
три способа опроса клавиш.
1ый
10 IF INKEY$="A" THEN - это занимает 12 байт
2ой
вначале идёт строка LET A$= INKEY$
10 IF A$="A" THEN -это занимает 13 байт
3ий
вначале идёт строка LET IK= CODE INKEY$
10 IF IK=65 THEN - это занимает 18 байт
почему ?
по идее 3ий должен быть самым меньшим.
есть ли ещё способ опроса клавиш, что меньше 12 байт занимала ?