PDA

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



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

ZEman
31.07.2016, 06:29
кто может подсказать, поделиться опытом как сделать пару простейших вещей на бейсике.
итак, для примера:
есть некая простейшая программка на басике в которой управляешь точкой на экране.
точка может двигаться вверх, вниз, влево, вправо с помощью клавиш Q, A, O, P.
также есть клавиша S по нажатии на которую происходит сохранение экрана на ленту (SAVE "" SCREEN$).
есть пара вопросов которые давно уже меня мучают.

1. как сделать сохранение SAVE без появления стандартной надписи в служебной области экрана (start tape, then preess anu key).
дабы не затирались надписи в служебной части экрана ?

вообще-то я знаю один способ, изображение попиксельно заносится в указанную память (например 30000).
затем делается сохранение save ""code 30000,6912.
но хотелось бы именно просто сейвом сохранить экран.

2. точка может двигаться по любым координатам x, y.
x (0-255), y(0-175).
а есть ли какой-то способ завести точку в служебную область экрана ?
я могу вносить в служебную область различные символы (текст), но вот точки и линии никак не выходит.

null_device
31.07.2016, 07:44
ZEman,

1. ЕМНИП, без примененния кодовых процедур - никак. Либо переносите экран в буфер и сохраняетесь оттуда. Или используете процедуру: сохранение файла без заголовка из книги "...для пользователей и программистов". Вариант без кодовой процедуры: сохраняться на дискету в tr-dos.

2. Cредствами чисто бейсика этого никак не добиться. Диалект PRO-DOS умеет рисовать в служебной части экрана, но занимает память и не имеет оператора POINT.

ZEman
31.07.2016, 07:56
ZEman,

Или используете процедуру: сохранение файла без заголовка из книги "...для пользователей и программистов". POINT.

а в какой именно книге это описано, не подскажите ?

null_device
31.07.2016, 08:41
в какой именно книге это описано

Ларченко\Родионова: ZX-Spectrum (и TR-DOS) для пользователей и программистов. Глава: использование подпрограмм ПЗУ.

Kalantaj
31.07.2016, 08:48
а в какой именно книге это описано, не подскажите ?
Имеем следующее:

Загрузка и запись файлов на магнитофон

Как правило, файл, записанный на магнитной ленте, состоит из двух блоков, первый из которых называется заголовком и содержит информацию о файле (тип, длина и т. п.), второй — собственно данные. Подпрограмма ПЗУ загружает и обрабатывает заголовок и на основе полученной информации загружает данные.
Длина заголовка составляет 17 байт:

байт 0 — тип файла:
0 — бейсик-программа;
1 —числовой массив;
2 — символьный массив ;
3 — двоичный (кодовый) файл.
байты 1...10 — имя файла;
байты 11, 12 —длина блока данных;
байты 13, 14 — для типа 0: номер строки автозапуска;
— для типа 3: начальный адрес загрузки;
байт 14 — для типов 1 и 2 — имя и тип массива в
следующей форме:
биты 0...4 — имя массива (А...Z);
бит 5 — 0, если массив числовой;
бит 6 — 1, если массив символьный;
бит 7 — всегда установлен;
байты 15,16 — длина бейсик-программы.


Загрузка файла без заголовка: CALL 1366 (#0556)

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

LD IХ,<начальный адрес>
LD DЕ,<длина блока>
LD А,<флаг>
SCF
CALL 1366 ;вызов процедуры загрузки
RET

В индексный регистр IX загружается адрес ячейки памяти, начиная с которой будет производиться проверка или загрузка блока кодов. В регистровую пару DE помещается длина загружаемого файла в байтах, а в регистр А — так называемый флаговый байт. Он равен нулю, если ожидается заголовок, и 255 — если тело файла (возможны и другие значения флагового байта). Загрузка кодового блока будет производиться, если перед выполнением процедуры был установлен флаг CY, проверка блока — если CY сброшен.
По возврату из процедуры, если загрузка (проверка) произведена успешно, флаг CY устанавливается, в противном случае — сбрасывается.
Прервать загрузку (проверку) блока можно, нажав клавишу Break, при этом на экран выдается сообщение BREAK — CONT repeats. Для запрещения прерывания загрузки нужно несколько изменить программу вызова процедуры:

LD IХ,<начальный адрес>
LD DE,<длина блока>
LD А,<флаг>
SCF
INC D
ЕХ AF,AF'
DEC D
DI
LD A,15 ;номер начального цвета бордюра + 8
OUT (254),A
CALL 1378
LD А,7 ;восстановление цвета бордюра
OUT (254),А
EI
RET
Если при возврате из этой подпрограммы флаг переноса равен нулю,
то это означает, что либо загрузка (проверка) произведена с ошибкой, либо во время загрузки была нажата клавиша Break. Более точно установить причину ошибочного завершения операции можно, опросив клавиатуру.

Запись файла без заголовка; CALL 1218 (#04С2)

Подпрограмма служит для записи данных на магнитофон и вызывается аналогично процедуре загрузки:

LD IХ,<начальный адрес>
LD DЕ,<длина блока в байтах>
LD А,<флаг>
CALL 1218
RET

При нажатии клавиши Break выполнение процедуры будет прервано и выдано сообщение BREAK — CONT repeats, чего можно избежать, запустив процедуру не с адреса 1218, а с 1222.




Таким образом, чтобы записать картинку, которую потом можно будет загрузить командой LOAD "" CODE или LOAD "" SCREEN$, надо записать два кодовых блока:
1. Длиной 17 байт с флагом заголовка
2. Длиной в 6912 байт с флагом кодового блока.

Destr
31.07.2016, 09:18
1. Есть выход делая POKE на переключение каналов вывода (ну допустим на принтер кинуть их, один фиг zx-принтера ни у кого нету, заголовки печататся не будут).
2. Выводить точку в служебную область бейсик не даст, но это легко обходится СВОЕЙ процедурой печати точки (т.е. вместо PLOT x,y - вызывать что-то вроде FN x,y или тупо GOSUB с переменными).
Можно RANDOMIZE USR, но это уже асм :)

null_device
31.07.2016, 09:24
на принтер кинуть их, один фиг zx-принтера ни у кого нету, заголовки печататся не будут

И работать на некоторых моделях спектрумах тоже. Имел "удовольствие" столкнуться с зависающими программами, если интерфейс принтера был "своеобразно" реализован.

Destr
31.07.2016, 09:36
И работать на некоторых моделях спектрумах тоже. Имел "удовольствие" столкнуться с зависающими программами, если интерфейс принтера был "своеобразно" реализован.
Да, есть такое дело.
Но ведь человек просит чисто для собственного юзанья, значит если прокатит - то и пущай себе пользует на здоровье...
(не будет ведь он писать коммерческий граф-редактор на бейсике, да с распостранением по всему миру, учитывая что zx-мир остался фиг да нифига...)

Kalantaj
31.07.2016, 10:46
как сделать сохранение SAVE без появления стандартной надписи в служебной области экрана (start tape, then preess anu key).
дабы не затирались надписи в служебной части экрана ?
Программа будет выглядеть примерно так:

LD IХ,zagolovok ; указываем где лежат 17 байт заголовочных данных
XOR A; указываем что тип - заголовок
LD DЕ,17; указывем длину - 17 байт
CALL 1218 ; вызываем процедуру записи в ПЗУ
LD IХ,16384 ; начало экранной области
LD DЕ,6912 ; длина картинки
LD А,255; указываем что запишем кодовый блок
CALL 1218 ; производим запись
JP 56 ; переход на опрос клавиатуры с последующим возвратом в бейсик.
zagolovok db #03, "screen ", #00, #1b, #00, #40, #0, #0

Чтоб не ломал голову как это реализовать, в приведенной тобой программе я добавил 0 строку с REM, где разместил код записи блока, а в 600 строке сделал вызов этого блока. Единственный "косяк" такого способа - плохо просматривать листинг программы.
В аттаче - измененная твоя программа.

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

Чтоб не кохаться с плохопросматриваемым листингом программы во время редактирования, можно сделать так - записать одну программу, в которой будет только строка
0 REM CODEBLOCK (кодовый блок для записи картинки)

и вторую программу - основную. После редактирования второй программы (основной) сделать MERGE "" - слить программу и кодовый блок для записи, а затем записать всё вместе на ленту.

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

Я сам когда-то ну ОЧЕНЬ давно делал похожую программу на бейсике. Только управление было от Кемпстон-джойстика. При нажатии на FIRE ставило точку. Плюс была кнопка включающая INVERSE и другая - OVER. Плюс ещё одна - постоянное рисование/отображение точки как курсора позиции.
Вот как-то так.
Потом ещё добавлял опрос кнопок 1-7, выбирающие цвет точки, но, как сами понимаете, из-за клешинга ничего хорошего не вышло.

Destr
31.07.2016, 11:34
Немного оффтоп, но навеяло: Световой карандаш - девайс описаный в "Периферия своими руками" например. На ЖК-экранах видимо работать не будет? Или есть варианты (конечно всякий блуд с миганием брихта на знакоместе не надо даже думать).
Помнится там тоже для теста была сверхмедленная прога на бейсике, которая тоже криво ставила точки (ну чем не QAOP, почти те-же муки)...
P.S. Всяким инженерам-железячникам на заметку: А слабо раздербанить старый (в смысле ненужный) телефон с датчиком позиции и забабахать приблуду которая карандаш.
Видится как стилус со своей батарейкой + некая НЁХ которая на дисплей надевается и считывает позицию стилуса относительно себя (т.е. прилепляется в левом-верхнем углу скажем) и данные гонит в комп (по любому порту, например принтеровскому. Да хоть мышкиному...)
Ну и прога которая ловит данные и ставит точки - делов-то...

Alex Rider
31.07.2016, 12:28
Но ведь человек просит чисто для собственного юзанья, значит если прокатит - то и пущай себе пользует на здоровье...
Не, ребята, не надо давать изначально плохих советов, ТС же учится только. И вряд ли забудет этот опыт навсегда.
PS "Аналогичный" вариант с перенаправлением вывода в канал К на процедуру из одного ret предлагать тоже не надо, ибо при нажатии BREAK / SPACE будет ахтунг.

Destr
31.07.2016, 12:44
Не, ребята, не надо давать изначально плохих советов, ТС же учится только
Ну раз так, то я только "ЗА".
Давайте сразу отговорим человека мучатся с бейсиком (на том уровне запросов как он уже достиг - пора ему на асм переползать, другой дороги на спеке нету, ну конечно если он не извращенец).

null_device
31.07.2016, 16:09
Давайте сразу отговорим человека мучатся с бейсиком

А как же иначе - если по обоим вопросам, вменяемых вариантов решения, средствами самого бейсика нет?!

Kalantaj
31.07.2016, 20:49
По-моему создать небольшой кодовый блок средствами бейсика (data/read/poke) при старте программы и использовать код - вполне элегантное решение. Это не затрудняет листинг программы (как в предложенном мной варианте) и не требует подгрузки дополнительных блоков. А учитывая что размер кодовых блоков - мизерный, то создание оных в памяти дело пары секунд.

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

Второй вариант, как предложил я - влепить всё в REM строку первую (нулевую) и вызывать оттуда.
Но тут есть одно НО - вызывать придется не напрямую указывая адрес (например - RANDOMIZE USR 23760) а относительно переменной PROG (не пинайте - не помню точного названия) - ведь могут быть инициализированы переменные TR-DOS или-что-то-там-ещё что отодвигает программу от адреса 23755, соответственно и код двигает. Но вызывать так - не особо удобно - RANDOMIZE USR 5+PEEK PROG+PEEK (PROG+1)*256

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

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

null_device
31.07.2016, 20:53
Но вызывать так - не особо удобно

Можно так:

LET ADD=5+PEEK 253635+256*PEEK 23636 : LET ADD = USR ADD

Таким образом не "портится" оператор RND и на выходе в переменной будет лежать значение регистров BC (или, что там возвращает функция USR?).

Kalantaj
31.07.2016, 20:54
Ну а если человек не хочет на асм переходить, то, думаю, можно помочь ему с реализацией первого или второго варианта. Ведь дело то несложное.
Вы вон развели треск ни о чем, а могли бы как я - взять и предложить хоть какое-то готовое решение. Пусть не самое универсальное, но было бы лучше ТС - чем прочитать фигзнаетсколькобукафф, не понять ничего и ничего не получить в результате понятных только программисту на асме советов.

Destr
31.07.2016, 20:58
Но вызывать так - не особо удобно
Вроде ведь можно обозвать переменную как нибудь LET plot=PEEK PROG+PEEK (PROG+1)*256 и вызывать через неё (RANDOMIZE USR plot).
Или даже через FN (тогда можно и параметры прикрутить).
Вон как инфоркомовцы делали:http://zxpress.ru/book_articles.php?id=1539
(статья не шибко хорошо распознана, так что лучше скачать и читать саму книжку).

null_device
31.07.2016, 21:02
Kalantaj, тяжело советовать что-то не видя всей картины. Насколько я понял, ваяется, что-то наподобии графического редактора (точка на весь экран, сохранение его на ленту :) ).
Возможно есть вариант использовать какой-то иной метод для достижения того же результата. Более простой, но не очевидный ТС.
....
Пару лет назад откопал свои старые поделки конца 90-х, на бейсике. Долго "втыкал" в листинг, пытаясь понять как это работает. Ибо - выглядело это, как дичайший индусский "ковнокод". Со временем, все же вырабатывается "почерк" написания программ. И одна и та же задача, спустя время будет достигнута куда проще и "элегантней". ;)

Destr
31.07.2016, 21:06
а есть ли какой-то способ завести точку в служебную область экрана ?

И одна и ту же задача, спустя время будет достигнута куда проще и "элегантней".
Я лично (если уж приспичило-бы именно на бейсике точки рисовать там где не положено) тупо делал бы POKE в нужный адрес экрана. Так-же как на асме. Даже с табличкой предпросчитаной (чтоб быстро было).

Kalantaj
31.07.2016, 21:11
Kalantaj, тяжело советовать что-то не видя всей картины
Да что ж там картину видеть то?
ТС приложил же снапшот - там строк - раз два и обчелся.

null_device
31.07.2016, 21:13
тупо делал бы POKE в нужный адрес экрана

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

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


ТС приложил же снапшот - там строк - раз два и обчелся.

Походу, "слона"-то я и не приметил.

ZEman
01.08.2016, 17:11
Kalantaj,Насколько я понял, ваяется, что-то наподобии графического редактора (точка на весь экран, сохранение его на ленту :) ).

ну почти.
Я хотел сделать редактор уровней для одной из своих игр.
но потом эта прога разрослась до чего-то типа графического редактора.

ZEman
03.08.2016, 20:10
возникла вот какая проблема, ломаю голову и не знаю как записать.
например у меня есть переменная записанная в двоичном виде.
скажем
LET A=01100110
вопрос а как теперь перевести это двоичное число в десятичное ?
то-есть я знаю что если написать Print BIN 01100110 то мне выдастся значение 102.
а как это записать в программе ?
хотел записать что-то типа LET B=BIN A - да фиг там, бейсик такого не даёт.

Black Cat / Era CG
03.08.2016, 20:52
Это не переменная записанная в двоичном виде, это обыкновенная переменная с десятичным числом 1100110. Надо было писать LET A=BIN 01100110

ZEman
03.08.2016, 20:58
оно понятно, но у меня значение не одно и то-же, оно может быть разным.

Black Cat / Era CG
03.08.2016, 21:22
Не понимаю, что у вас не получается.
Точнее, что именно вам требуется сделать.

Alex Rider
04.08.2016, 01:20
Если двоичное число записано как десятичное:

LET A=01100110,
то надо сделать так:

LET B=VAL ("BIN " + STR$ A).

Если число записано как строка из ноликов и единичек (например, воодится пользователем в INPUT A$), то

LET B=VAL ("BIN " + A$)

Разумеется, BIN в кавычках - ключевое слово.

ZEman
04.08.2016, 08:34
Alex Rider, большое спасибо, выручил.
Первый вариант твоего ответа.

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

Ещё один маленький вопрос.
Не раз уже с таким сталкивался.
Код:
10 Input a$
20 Print At 10,10;a$

а$ - может быть любым знаком например буквой от A до Z.
Но как сделать так чтобы эта а$ печаталась сразу в "графическом режиме" - курсор "G" ?

Destr
04.08.2016, 09:12
Но как сделать так чтобы эта а$ печаталась сразу в "графическом режиме" - курсор "G"
PRINT CHR$ (CODE a$+79).
(работать будет при вводе заглавных A...U, остальных букв в UDG нету)

Alex Rider
04.08.2016, 12:07
Первый вариант твоего ответа.
Гложет вопрос: а зачем так, почему конвертишь десятичные числа, а не строки из 0 и 1?

ZEman
04.08.2016, 14:04
а строк нету, там квадрат 8х8 знаков из которых складывается символ.
нечто вроде спрайтгенератора делаю.

Alex Rider
04.08.2016, 15:14
А откуда эти числа берутся?

ZEman
04.08.2016, 15:35
это ещё только заготовка, но вот что уже у меня получилось.

Destr
04.08.2016, 16:16
это ещё только заготовка, но вот что уже у меня получилось.
Может логичней сперва запросить букву и потом при рисовании - вбивать точки в неё напрямую (одновременно и освежая на экране) ?

ZEman
04.08.2016, 16:20
я её ещё дополню, может и пределаю побольше.
люблю вот-так вот возиться над какой-нибудь прогой, чаще даже больше сам процесс нравится чем конечный результат.

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

это похоже, у многих так

ZEman
04.08.2016, 16:28
эммм...
а в каких адресах располагаются UDG символы, чтобы их можно было очистить и вернуть прежние.
вроде гдето на 64000 ?
clear их не уничтожит ?

Destr
04.08.2016, 17:33
а в каких адресах располагаются UDG символы, чтобы их можно было очистить и вернуть прежние.
вроде гдето на 64000 ?
Адрес любого UDG символа можешь узнать набрав PRINT USR "A"

clear их не уничтожит ?
Их не уничтожит даже NEW.
После RANDOMIZE USR 0 в область UDG видимо копируются 168 байт стандартного фонта.

ZEman
04.08.2016, 17:59
я помню что шрифты загруженные из Art Studio можно переключать с помощью poke 23607,250 и poke 23607,60.
c udg так нельзя что-ли ?

Destr
04.08.2016, 18:17
c udg так нельзя что-ли ?
Вроде бы нет, хотя где-то в ревю было что-то типа "Создание банков графики пользователя".
Ага, вот тут: Графика пользователя. Создание банков символов графики пользователя. (http://zxpress.ru/book_articles.php?id=1533)

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

Alex Rider
04.08.2016, 18:49
c udg так нельзя что-ли ?
Можно. Адрес текущего набора UDG находится в системной переменной по адресу 23627, 23628.

clear их не уничтожит ?
Нет, если делать просто CLEAR. Если сделать CLEAR с числом, большим, чем 65367, то стеки процессора и GO SUB затрут символы штатного набора UDG.

После RANDOMIZE USR 0 в область UDG видимо копируются 168 байт стандартного фонта.
Да, 168 байт с адреса 15880. Для "очистки" UDG (возврата их в начальное состояние) можешь тоже скопировать 168 байт оттуджа на адрес USR "A".

Вообще для редактора UGD-графики я бы порекомендовал сделать штуки 4 подряд идущих набора, которые можно выгружать как вместе, так и по отдельности (допустим, первые три или второй и третий). Тогда можно будет удобно создавать банки символов UDG для BASIC-игр.

null_device
05.08.2016, 00:20
нечто вроде спрайтгенератора делаю.

Как-то выкладывал модифицированную версию спрайт-генератор из книжки "...как написать игру на бейсике".

ZEman
05.08.2016, 18:49
вот же.
малость сглупил и наделал кучу лишних строк в программе, а можно было сделать намного проще.
есть ли какой-то способ удалить много строк сразу или может есть какая утилита которая позволяет редактировать снапшот ?

null_device
05.08.2016, 20:25
есть ли какой-то способ удалить много строк сразу

Их есть у меня!

Загружаете данную программу к своей с помощью команды MERGE и запускаете ее командой GOTO 0 или RUN. Вводятся два числа, с какой и по какую строки программы надо удалить, после чего и происходит их удаление. Имейте ввиду, сама она "лежит" в строке 0, поэтому стоит побеспокоиться заранее, если в вашей программе такая строка тоже есть.

ZEman
06.08.2016, 06:04
null_device, что-то не то скинули.
у вас в архиве trd файл на 600кб.

Bedazzle
06.08.2016, 08:17
null_device, что-то не то скинули.
у вас в архиве trd файл на 600кб.

Вполне то:
https://i.imgur.com/3LY8mEj.png

Reobne
06.08.2016, 08:17
ZEman, Всё правильно null_device скинул. На всякий случай переделал её в TAP.

null_device, как предполагается стирать эту нулевую строку? (после использования)
Попробовал стереть её, ей же самой - зависло. :)

ZEman
06.08.2016, 09:07
Reobne, нулевую строчку делаеш первой и потом её удаляешь.

Reobne
06.08.2016, 09:19
ZEman, так ведь она сделана нулевой, для того чтобы не стереть первую строчку программы, которую пишем. Правильно? :)

Destr
06.08.2016, 09:39
ZEman, так ведь она сделана нулевой, для того чтобы не стереть первую строчку программы, которую пишем. Правильно?
Ну и пофик, будут две первых строки :)
(правда непонятно что удалится если вызвать удалятор)

ZEman
06.08.2016, 09:39
это был ответ как удалить саму утилиту которая сидит в нулевой строке.

null_device
06.08.2016, 10:23
как предполагается стирать эту нулевую строку? (после использования)
Попробовал стереть её, ей же самой - зависло.

Ручками, как написано ниже (переименовать и удалить). При удалении самой себя - вполне возможно получение "недокументированных эффектов". :)
Программа, специально лежит в нулевой строке, чтобы можно было рассчитать ее адрес и не затирать листинг программы (т.к. обычно это, невозможно создать "честными" средствами бейсика).
У меня как правило в нулевой строке "лежат" комментарии, знакогенератор или код. Все что нужно, это после использовании программой подгрузить его также с помощью MERGE.

Reobne
06.08.2016, 12:41
null_device, Вот у тебя написано "CALL 6629: RET", то есть после стирки проц. должен прочитать RET. А что если заменить это на "JP 6629"? Это и короче, и после стирки программа уже не нужна. Бейсик, конечно, готу непонятно куда, в середину строки наугад. Но рискнуть можно, вероятность очень высокая, что бейсик ругнётся, и будет дальше работать.
Попробовал, работает. Прикладываю архив, в нём новая версия в TRD и в TAP форматах.

Перед сохранением сделал CLEAR, так что теперь, без переменных, прога весит 249 байт и вписывается в один сектор.

null_device
07.08.2016, 15:10
А что если заменить это на "JP 6629"? Это и короче, и после стирки программа уже не нужна.

Кодовая часть процедуры была мною взята, кажется из "zx-ревю". Используются куски кода из ПЗУ, которые также содержат перекрестные ссылки и переходы к подпрограммам и манипуляции со стеком. Попросту, не рискнул что-то менять.
Экономия 1 байта? Тогда уж стоило "оптимизировать" и бейсик-часть (задать однобуквенные переменные и VAL для чисел). ;)
А, если нам надо удалить строки в нескольких местах программы?

Reobne
07.08.2016, 18:47
null_device, Извини, что я поленился объяснить подробнее.
Например нам надо удалить строки с 500 по 600 и с 1000 по 1999
Подгружаем MERGE"DELETE"
Запускаем RUN
Вводим 500
Вводим 600
Нулевая строчка остаётся.
Теперь RUN/1000/1999
Стёрли всё что хотели стереть.
И наконец стираем 0-ю строку:
RUN/0/0
Бейсик удивится, обзовёт это нонсенсом, но можно будет работать дальше. (А в первом варианте всё зависало.)

Alex Rider
07.08.2016, 21:53
RUN/0/0
Бейсик удивится, обзовёт это нонсенсом, но можно будет работать дальше. (А в первом варианте всё зависало.)
И все же более корректный и надежный вариант: POKE 23756,n, где n - номер строки, которого в программе гарантированно нет,и удалить строку n штатными средствами. 23756 - это если в TR-DOS не входили. Если входили - 23868.

null_device
08.08.2016, 12:28
А в первом варианте всё зависало

Ничего удивительного. Последний вызов подпрограммы, начинает стирать строку 0, поэтому, после возврата из ПЗУ, команды RET на своем месте, уже не будет. В результате, будет выполнено нечто с адреса 24115.
В целом, использование JP, вместо CALL в данном случае, для возврата из подпрограммы - можно считать допустимым.

iceoflame
08.08.2016, 14:38
На ЖК-экранах видимо работать не будет? Не будет, как и световой пистолет на Денди.

Eltaron
08.08.2016, 20:17
Не будет, как и световой пистолет на Денди.
Ну, положим, вовсе не "как и", потому что пистолет на Денди не отслеживает луч.

null_device
08.08.2016, 21:54
потому что пистолет на Денди не отслеживает луч.

Разве, при нажатии курка экран на кадр (или несколько кадров) не гасится, а подсвечивается только квадрат спрайта в который нужно "попасть" фотоприемником пистолета?!
Не световое перо, конечно - но принцип "как-то" привязан к частоте кадров (явно, учитывалась некая инерционность и послесвечение ЭЛТ экрана).

Eltaron
08.08.2016, 22:51
Разве, при нажатии курка экран на кадр (или несколько кадров) не гасится, а подсвечивается только квадрат спрайта в который нужно "попасть" фотоприемником пистолета?!
Именно так. А по принципу светового пера работает мифический пистолет от Super Nintendo.


Не световое перо, конечно - но принцип "как-то" привязан к частоте кадров (явно, учитывалась некая инерционность и послесвечение ЭЛТ экрана).
Есть мнение, что единственная причина, по которой пистолет не работает - это тормознутость АЦП ЖК-телевизора, что он просто не успевает вовремя белые квадраты выводить. Ещё говорят, что фотоприемник больше в инфракрасный спектр смещен. Это тоже похоже на правду, я однажды подцеплял пистолет к микроконтроллеру, ну и, в общем, даже практически в упор разница между уровнями черного и белого на ЖК была маловата для четкого различения.

null_device
09.08.2016, 00:41
единственная причина, по которой пистолет не работает - это тормознутость АЦП ЖК-телевизора, что он просто не успевает вовремя белые квадраты выводить.

Скорее, "большой пинг" между событиями: нажатие на курок -> подсвечивание квадрата ->проверка наличия в фокусе "белого пятна".


говорят, что фотоприемник больше в инфракрасный спектр смещен.

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

ZEman
12.08.2016, 17:00
натолкнулся на такое.
делал оцифровки с некоторых своих кассет и наткнулся на одну недописанную программу.
проще говоря запись где-то в конце просто обрывается (конец программы затёрт когда-то давно по неизвестным причинам).
в результате запись открывается, можно просмотреть листинг программы.
смотреть можно до 495 строки.
удалить 495 строку не получается, прога после этого просто зависает или пишется всякая чепуха.
как можно удалить из программы эту дрянь чтобы с программой можно было работать дальше ?

Alex Rider
12.08.2016, 18:00
как можно удалить из программы эту дрянь чтобы с программой можно было работать дальше ?
1. Первый байт строки 495 (первый байт ее номера, а не оператора). Искать любым монитором.
2. Написать в первый байт строки 495 (после кода 13 предыдущей строки) число 128.
3. Записать адрес байта 128 в переменную VARS (23627/23628)
4. Сделать CLEAR.
5. Сохранить программу.

ZEman
12.08.2016, 18:48
если быть честным то я мало что понял из объяснения, мониторами никогда не пользовался раньше.

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

goodboy
12.08.2016, 19:17
как можно удалить из программы эту дрянь чтобы с программой можно было работать дальше ?


1 BORDER 0: PAPER 0: INK 7: CLS

2 POKE 23607,250

3 FOR A=-60 TO 60 STEP 5: BEEP 0.01,A: NEXT A

5 GO SUB 9000

10 REM ==TOPITIP==

15 PRINT AT 0,17;" TOPITIP"

17 PRINT AT 2,17;"=2.173"

20 PRINT AT 6,0;"IGRA PROSTA: UPRAVLdd NOLIKOM NADO COBRATa OPREDELENNOE KOLIWESTVO DOLLAROV ($),PRI cTOM NELad NATbKATaSd NA REHETKU (#),TAKJE MOJNO SOBIRATa VOPROSb () PRI cTOM Vb MOJETE LIBO POLUWITa 100 OWKOV LIBO MOJETE UMERETa,TAK-WTO VbBIRAITE."

22 PRINT AT 18,0;" q , A , O , p "

24 PRINT AT 21,17;"1"

25 PAUSE 0

26 PAUSE 0

29 REM ==MATEMATIKA==

30 GO SUB 9000

31 PRINT AT 0,17;" MATEMATIKA"

35 PRINT AT 2,17;"=2.624"

40 PRINT AT 6,0;" MATEMATIKA: IGRA OBUWAQeAd SLOJENIQ,VbWITANIQ,UMNOJENIQ I DELENIQ,A TAKJE REHENIQ PROSTEIHIX UROVNENII,DLd VTOROGO-TRETaETaEGO KLASA."

42 PRINT AT 18,0;"ENTR - VVOD WISEL,KLAVIHI: 1,2.."

45 PRINT AT 21,17;"2"

47 PAUSE 0

48 PAUSE 0

49 REM ==TABBLE==

50 GO SUB 9000

55 PRINT AT 0,17;" TABBLE"

60 PRINT AT 2,17;"929 BAIT."

65 PRINT AT 6,0;" TABBLE: PROGRAMMA DLd VbWISLENId: SINUSA,KOSINUSA,TANGENSA,VbWISLENIE KORNd,NAXOJDENIE ABSOLQTNOGO WISA DANNOGO WISLA I.T.D."

67 PRINT AT 18,0;" LQBbE KLAVIHI.."

69 PRINT AT 21,17;"3"

70 PAUSE 0

71 PAUSE 0

75 REM ==BLOK-L==

80 GO SUB 9000

85 PRINT AT 0,17;" BLOK-L"

87 PRINT AT 2,17;"=7.659(OBeAd)"

89 PRINT AT 6,0;"BLOK-L: BEISIK ZAGRUZWIK PROGRAMMb _LASER-BEISIK_"

91 PRINT AT 18,0;" OTSUTSTVUQT."

93 PRINT AT 21,17;"4"

94 PAUSE 0

96 PAUSE 0

99 REM ==BUM I BOM"

100 GO SUB 9000

102 PRINT AT 0,17;" BUM I BOM"

105 PRINT AT 2,17;"=4.469(OBeAd)"

107 PRINT AT 6,0;"BUM I BOM: PRIKLQWENId DVUX ZABAVNbX KOLOBKOV,UPRABLdd IMI Vb DOLJNb SOBRATa KAK-MOJNO BOLaHE VSdKIX VKUSNbX VEeEI: _dBLOKI,VIHENKI,BANANb,TARELKI S SUPOM,A TAKJE VAM NADO IZBEGATa STOLKNOVENId S SERDCAMI,KOTORbE VO MNOJESTVE RAZBROSANb PO cKRANU POBEJDAET TOT KTO NABERET BOLaHE OWKOV."

109 PRINT AT 18,0;"SINKLAIR-DJOISTIK, KLAVIHI:q,A,O,p"

111 PRINT AT 21,17;"5"

113 PAUSE 0

115 PAUSE 0

120 REM ==BUM I BOM 2"

122 GO SUB 9000

125 PRINT AT 0,17;" BUM I BOM2"

127 PRINT AT 2,17;"=4.501(OBeAd)"

130 PRINT AT 6,0;" BUM I BOM2: ,NA cTOT RAZ BUMU NADO SPASTI BOMA,VAM TAKJE MEHAQTSd SERDCA RAZBROSANbE PO cKRANU,NO IGRA USLOJNdTSd: Vb MOJETE XODITa LIH VLEVO I VPRAVO,NASTUPIV NA PUSTOE MESTO Vb PADAETE VNIZ,VAM NADO VZdTa S SOBOI _BOMA_,MIGAQeII KOLOBOK,PO PUTI SOBIRAITE VEeI,V IGRE DESdTa UROVNEI."

135 PRINT AT 18,0;"SINKLAIR-DJOISTIK."

137 PRINT AT 21,17;"6"

138 PAUSE 0

139 PAUSE 0

140 REM == ==TANK== ==

145 GO SUB 9000

150 PRINT AT 0,17;"=TANK="

152 PRINT AT 2,17;"=3.339(OBeAd)"

154 PRINT AT 6,0;" =TANK=: POLNOE NAZVANIE IGRb(TANKOS KOMANDOS),UPRAVLdd TANKOM Vb DOLJNb LOVKO OBYEZJAd MINb PROEXATa PO POLQ I SOBRATa VSEX SOLDAT A ZATEM ZAEXATa V KREPOSTa,IGRA PROSTAd,VAM DAETSd 5 JIZNEI, U VAS ESTa I cNERGId,SLEDITE ZA NEI I VREMd OT VREMENI POPOLNdITE EE ZAPAS(MOLNII)."

156 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

158 PRINT AT 21,17;"7"

159 PAUSE 0

160 PAUSE 0

165 REM ==DITETRIS==

170 GO SUB 9000

175 PRINT AT 0,17;" DITETRIS"

177 PRINT AT 2,17;"=6.545(OBeAd)"

179 PRINT AT 6,0;" DITETRIS: RAZNOVIDNOSTa TETRISA,V NEM NE NUJNO SOBIRATa LINII,NO ZATO V cTOI IGRE ESTa NESKOLaKO SQRaPRIZOV,KOTORbX NET NIVKAKOM DRUGOM TETRISE,A CELa IGRb OWENa PROSTA VAM NADO SLOJITa OPREDELENNOE KOLIWESTVO KUBIKOV,SQRPRIZb NAIDITE SAMI."

181 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

184 PRINT AT 21,17;"8"

186 PAUSE 0

188 PAUSE 0

190 REM ==INZZ==

195 GO SUB 9000

197 PRINT AT 0,17;" INZZ"

200 PRINT AT 2,17;"=2.218(OBeAd)"

205 PRINT AT 6,0;" INZZ: PITON,VAM NADO SOBRATa ZA OGRANIWENNOE VREMd ODINADCATa MUXOMOROV I IZBEJATa STOLKNOVENId S HARIKAMI,KOTORbE RAZBROSANNb PO VSEMU cKRANU."

207 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

209 PRINT AT 21,17;"9"

211 PAUSE 0

212 PAUSE 0

215 REM ==DIGGER.==

217 GO SUB 9000

220 PRINT AT 0,17;" DIGGER."

222 PRINT AT 2,17;"=4.012(OBeAd)"

224 PRINT AT 6,0;"DIGGER: WELOVEWEK BEGAET PO cKRANU I SOBIRAET ALMAZb, MOJNO DVIGATa KAMNI,ESTa V cTOI IGRE ODNA SLOJNOSTa: WELOVEWEK ROd ZEMLQ,KOTOROI POKRbT VESa cKRAN OCTAVLdET POZADI SEBd SLEDb PO KOTORbM BEGATa ON UJE NE MOJET,KAMNI VOKRUG VAS WASTO VZRbVATSd,A NA IX MESTE OPdTa-JE POdBLdQTSd SLEDb."

226 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

228 PRINT AT 21,17;"10"

229 PAUSE 0

230 PAUSE 0

235 REM ==M-KODE 1==

237 GO SUB 9000

239 PRINT AT 0,17;" M - KODE 1"

241 PRINT AT 2,17;"=1.206(OBeAd)"

243 PRINT AT 6,0;"M - KODE 1: MALENaKAd,MUZbKALaNAd PROGRAMKA SDELANNAd S POMOeaQ _VHAM_."

245 PRINT AT 18,0;" - / - / -"

247 PRINT AT 21,17;"11"

249 PAUSE 0

250 PAUSE 0

255 REM ==.,. ILI XARIOS==

257 GO SUB 9000

259 PRINT AT 0,17;" XARIOS"

261 PRINT AT 2,17;"=3.503(OBeAd)"

263 PRINT AT 6,0;" XARIOS: UPRAVLdd VOZDUHNbM HAPIKOM,KOTORbI VSE VREMd LETIT VVERX,VAM NODO VbLETETaNARUJU WEREZ VbXOD,MIGAQeIE STRELKI,IZBEGAITE STOLKNOVENII S KANCELdRSKIMI KNOPKAMI,HARIK VSE VREMd DERGAETSd V RAZNbE STORONb IZZA VETRA,BUDaTE OSTOROJNb U VAS VSEGO ODNA JIZNa,A UROVNEI CELbX DESdTa."

265 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

267 PRINT AT 21,17;"12"

268 PAUSE 0

269 PAUSE 0

270 REM ==TREASURE==

272 GO SUB 9000

275 PRINT AT 0,17;" TREASURE"

277 PRINT AT 2,17;"=4.059(OBeAd)"

279 PRINT AT 6,0;" TREASURE: POISKI PODVODNbX SOKROVIe,VAM NADO PODNATa SO DNA MORSKOGO NESKOLaKO SUNDUKOV S ZOLOTOM,SLEDITE ZA KISLORODOM,ZA KAJDbI SUNDUK VAM BUDUT DAVATa PO BALLONU KISLORODA,OSTEREGAITESa WUDOVIeA."

280 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

281 PRINT AT 21,17;"13"

282 PAUSE 0

283 PAUSE 0

285 REM ==MAZE==

287 GO SUB 9000

290 PRINT AT 0,17;" MAZE"

295 PRINT AT 2,17;"=5.672"

297 PRINT AT 6,0;" MAZE: cTO LABIRINT,PO KOTOROMU RAZBROSANb ALMAZb,SOBERITE IX VSE INAWE IX SOBERUT DVA STRAJA,KOTORbMI UPRAVLdET KOMPaQTER,KTO BOLaHE(KOMPaQTOR ILI Vb) SOBERET ALMAZOV TOT I VbIGRAET,VREMd OGRANIWENO."

299 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

301 PRINT AT 21,17;"14"

303 PAUSE 0

304 PAUSE 0

305 REM ==BOMB ATOM==

310 GO SUB 9000

315 PRINT AT 0,17;" BOMB ATOM"

317 PRINT AT 2,17;"=5.742(OBeAd)"

319 PRINT AT 6,0;" BOMB ATOM: CELI TUT NIKAKOI NET,PROSTO BOMBITE VSE WTO DVIJETSd I NABIRAITE OWKI."

320 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

322 PRINT AT 21,17;"15"

324 PAUSE 0

326 PAUSE 0

330 REM ==STAR VARS==

332 GO SUB 9000

334 PRINT AT 0,17;" STAR VARS"

336 PRINT AT 2,17;"=5.440(OBeAd)"

338 PRINT AT 6,0;" STAR VARS: ZVEZDNbE VOINb,BOMBITE KORABLI I SLADITE ZA VREMENEM,BSd IGRA."

340 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

345 PRINT AT 21,17;"16"

347 PAUSE 0

348 PAUSE 0

350 REM ==XONIK==

352 GO SUB 9000

354 PRINT AT 0,17;" XONIK"

356 PRINT AT 2,17;"=3.203"

358 PRINT AT 6,0;"XONIK: WELOVEWEK LAZAET PO POLQ I OSTAVLdET ZA SOBOI SLEDb PO KOTORbM UJE NELaZd XODITa,ZA VAMI GONdQTSd DVA BANDITA,NADO UNIWTOJITa KAK MOJNO BOLaHE ZEMLI."

360 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

362 PRINT AT 21,17;"17"

363 PAUSE 0

364 PAUSE 0

365 REM ==KAR.==

367 GO SUB 9000

369 PRINT AT 0,17;"KAR."

370 PRINT AT 2,17;"=5.797(OBeAd)"

372 PRINT AT 6,0;"KAR.: cTO KARATE,KOMENTARIEV NE NUJNO."

374 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

376 PRINT AT 21,17;"18"

378 PAUSE 0

379 PAUSE 0

380 REM ==FISHER==

382 GO SUB 9000

384 PRINT AT 0,17;" FISHER"

385 PRINT AT 2,17;"=6.105(OBeAd)"

387 PRINT AT 6,0;" FISHER: RbBAK,STARAITESa POIMATa,KAK MOJNO BOLaHE RbB,NO NE OSaMINOGOV I KONSERVNbX BANOK."

389 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

390 PRINT AT 21,17;"19"

392 PAUSE 0

394 PAUSE 0

395 REM ==PRESS ==

397 GO SUB 9000

399 PRINT AT 0,17;" PRESS "

401 PRINT AT 2,17;"=4963(OBeAd)"

403 PRINT AT 6,0;" PRESS: Vb KOLOBOK,VAM NADO SOBRATa DRAGOCENNOSTI,VAM MEHAQT: DRUGOI KOLOBOK,PRESSb,A TAKJE DbRKI WEREZ KOTORbE NADO PEREPRbGIVATa,SLEDITE ZA VREMENEM,IGRA OWENa INTERESNAd."

405 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

407 PRINT AT 21,17;"20"

408 PAUSE 0

409 PAUSE 0

410 REM ==TIR==

411 GO SUB 9000

412 PRINT AT 0,17;" TIR"

414 PRINT AT 2,17;"=3.850(OBeAd)"

416 PRINT AT 6,0;"TIR: POdSNENId NIKWEMU."

418 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

420 PRINT AT 21,17;"21"

422 PAUSE 0

423 PAUSE 0

425 REM ==* GUN *==

427 GO SUB 9000

429 PRINT AT 0,17;" * GUN *"

431 PRINT AT 2,17;"=7.509(OBeAd)"

433 PRINT AT 6,0;" GUN: PERESTRELKI NA PUHKAX,SLEDITE ZA dDRAMI,S POMOeaQ VSdKIX VEeEI UMNOJAQTSd VAHI OWKI,IGRA INTERESNAd I ZABAVNAd,CELa: SBITa FLAG PROTIVNIKA."

435 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

437 PRINT AT 21,17;"22"

438 PAUSE 0

439 PAUSE 0

440 REM ==DONIXLOGIK==

442 GO SUB 9000

445 PRINT AT 0,17;" DONIXlogik"

447 PRINT AT 2,17;"3.826(OBeAd)"

449 PRINT AT 6,0;"DONIXlogik: LOGIWESKAd IGRA,SLEDITE ZA VREMENEM,A O CELI DOGADAITESa SAMI,SKAJIM LIH ODNO STAVTE KUBIKI V KUWKU MOJET DOGADAETESa TOGDA OCELI."

451 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

453 PRINT AT 21,17;"23"

454 PAUSE 0

455 PAUSE 0

460 REM ==LALALA==

462 GO SUB 9000

464 PRINT AT 0,17;" LALALA"

466 PRINT AT 2,17;"=639(BAIT)"

468 PRINT AT 6,0;" LALALA: LABIRINT."

470 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

472 PRINT AT 21,17;"24"

473 PAUSE 0

474 PAUSE 0

475 REM ==SUPERMAZE==

477 GO SUB 9000

479 PRINT AT 0,17;" SUPERMAZE"

480 PRINT AT 2,17;"=2.809(BAIT)"

482 PRINT AT 6,0;"SUPERMAZE: LABIRINT,cTO PROSTO LABIRINT,LAZAITE PO NEMU KAK XOTITE,OSTEREGAITESa WUDOVIeA,V IGRE 6 BLOKOV."

484 PRINT AT 18,0;"SINKLAIR-DJOISTIK"

486 PRINT AT 21,17;"25"

488 PAUSE 0

489 PAUSE 0

490 CLS

495 PRINT AT 11,10


(надеюсь конвертер из текста в бейсик найдёшь самостоятельно)

ZEman
12.08.2016, 19:55
goodboy, так я уже делал, но так неинтересно.

goodboy
12.08.2016, 20:31
я конечно могу посоветовать ввести после сообщения об ошибке POKE 33463,128
только боюсь ты не хрена не-поймёшь что это меняет

ZEman
12.08.2016, 20:51
goodboy, насколько я понимаю это будет означать ввод значения 128 в адрес последней строки программы (495 или 490).

null_device
13.08.2016, 01:38
удалил 495 строку, но после этого сразу появилась нулевая строка с кучей вопросов.

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

ZEman
21.08.2016, 10:22
писал небольшую программку и столкнулся с маленькой проблемой.
во вложении программа, там задаётся имя блока для сохранения на ленту.
вопрос в том что я не могу придумать (понять) как удалить символы (по одному) из имени блока по нажатии клавиши delete (caps shift + 0).
кто может помочь ?

Reobne
21.08.2016, 11:27
if length=0 then goto 30
let length=length-1
n$=n$(TO length)
goto 60

и, там где печать имени, добавить пробельчик в конце;" "
чтобы стиралось старьё.
Должно сработать.

ZEman
21.08.2016, 11:41
спасибо.
даже и не додумаешься.
и откуда только берётся такое типа "n$=n$(TO length)".

Eltaron
21.08.2016, 11:52
спасибо.
даже и не додумаешься.
и откуда только берётся такое типа "n$=n$(TO length)".
Это краткая форма от n$(1 TO length). Нормальный такой синтаксис взятия подстроки.

null_device
21.08.2016, 13:36
ZEman, я бы не использовала многобуквенные переменные. Толку от них мало, а памяти они жрут много. К тому же, весьма утомительно набирать их и велика вероятность допустить ошибку при наборе имени.
Ноль, в десятичных числах, перед запятой - можно опускать.
Более оптимально использовать несколько иной способ опроса клавиш.
Автоматическое сохранение по достижению 9 символов - не самое удачное решение. Лучше, по клавише ENTER.
...
Если еще немного подумать, можно в целом оформить процедуру куда оптимальней. Сейчас строки, расположены как-то уж слишком сумбурно, куча ненужных переходов туда-сюда.

ZEman
21.08.2016, 16:11
Толку от них мало, а памяти они жрут много. К тому же, весьма утомительно набирать их и велика вероятность допустить ошибку при наборе имени.
в курсе, но так проще их запоминать чтобы потом не путаться и вспоминать "для чего-же эта переменная...".


Более оптимально использовать несколько иной способ опроса клавиш.
я несклько способов знаю:
1.
let a$=inkeys$
if a$=....
2.if inkeys$=....
3.code inkeys$....

пользуюсь каким удобней просто.


Автоматическое сохранение по достижению 9 символов - не самое удачное решение. Лучше, по клавише ENTER.
так там и так при достижении 10 символов происходит сохранение (больше 10 символов в имени нельзя ведь).

кстати заметил весьма забавную вещь можно нажимать shift + "символ", caps shift + "символ" при этом в имя будут добавляться команды, а при сейве получится длииииинное имя, но бейсик как ни странно не ругается при этом.


я бы не использовала
это ошибка или...
:)

Black Cat / Era CG
21.08.2016, 16:26
при этом в имя будут добавляться команды, а при сейве получится длииииинное имя, но бейсик как ни странно не ругается при этом.
Потому что токен, это 1 символ (байт). Так можно.

ZEman
21.08.2016, 16:42
на 4ой странице я уже выкладывал знакогенератор.
продолжаю над ним потихоньку работать.
пишу как говорится по чайной ложке в день, потому и так медленно (зато всё проверенно).
вот что уже получилось (смотрите вложение).
правда отрисовка экрана под бейсиком без компилятора работает медленно (советую в такие моменты ускорять эмуляцию в эмуляторах), а в остальном весьма неплохо получилось.
программа ещё не дописана.

null_device
21.08.2016, 18:30
это ошибка

Ошибка - ошибка. :)


заметил весьма забавную вещь можно нажимать shift + "символ", caps shift + "символ" при этом в имя будут добавляться команды

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


я несклько способов знаю

Если нужен именно код нажатой клавиши, вы проделываете пустую работу - в каждом операторе проверки, добавляете CODE. Да, символьная переменная занимает меньше места, но вся эта эквилибристика с конвертацией туда-сюда весьма утомительна. Вдобавок, еще мне кажется это сказывается на быстродействии программы.
Существует еще вариант с опросом переменной LAST_KEY. По крайней мере я им давно пользуюсь.

ZEman
28.08.2016, 16:43
подскажите пожалуйста POKE с помощью которых курсор переводится в EXTEND MODE и POKE для перевода курсора в GRAPH MODE.
а также возвращения его назад в обычное состояние.

Black Cat / Era CG
28.08.2016, 17:53
MODE 23617 / IY+7 / #5C41
0 - режим K, L или C (только 1 символ);
1 - режим E (только 1 символ);
2 и более - режим G (все последующие символы). При значении больше 2 меняется внешний вид курсора.
Из книги ZX Spectrum & TR-DOS для пользователей и программистов.

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

Сам не пробовал

ZEman
28.08.2016, 18:49
poke 23617, 1 (или 2) - не работает.

null_device
28.08.2016, 18:54
подскажите пожалуйста POKE с помощью которых курсор переводится в EXTEND MODE и POKE для перевода курсора в GRAPH MODE.

А, для чего и как вы собираетесь это использовать?

ZEman
28.08.2016, 18:57
знаю что poke 23658,8 - делает "С" режим курсора.
poke 23658,0 - возвращает в "L" режим.
мне нужно принудительно поставить режим курсора "Е" или "G".

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


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

null_device
28.08.2016, 19:09
текстовый редактор, печать текста и нужно переключать режимы.

А практический смысл?
Сканируете нажатие клавиш (включающих режим E и G). "Взводите" флаг режима и печатаете символ в соответствии с состоянием флагов и нажатой клавишей.

Black Cat / Era CG
28.08.2016, 19:21
poke 23617, 1 (или 2) - не работает.
В редакторе да. А вот в run-time - пашет.
Запустите например программку:
10 POKE 23617,1: INPUT a
или

10 POKE 23617,4: INPUT a
Правда, во втором случае курсор меняется на G сразу же после 1 символа.

ZEman
28.08.2016, 19:21
ну допустим.
у меня програмка типа:
100 let a$=inkeys
110 if code a$=5 движение влево
120 if code a$=8 движение вправо
....
150 if code a$=14 - (нажата клавиша extend mode) gosub 1000
160 if code a$=15 - (нажата клавиша graph mode) gosub 1000
200 if a$<>"" then gosub 1000
300 go to 100
1000 print at y,x;a$
...
1050 return

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

null_device
28.08.2016, 19:35
ZEman, я уже писал вам, что пользуетесь неоптимальным методом опроса клавиатуры. Используйте цифровое представление нажатой клавиши (конструкцию LET K = CODE INKEY$ или значение переменной LAST_K). Упрощается вычисление отображения символа.

ZEman
28.08.2016, 19:39
а какая разница ?
code inkey$ - это тоже самое.
код клавиши "graph" - также равен 15.
код клавиши "extend" = 14
движение влево, вправо, верх, вниз - 8,9,10,11.
delete = 12.
enter = 13.
и.т.д.

null_device
28.08.2016, 19:51
ZEman, смотрите: мы переключаемся на заглавные буквы (через poke 23658,8).
Нажатие клавиш с буквами, выдает коды в диапазоне 65-90. Не зависящее от того - нажата клавиша SHIFT или нет.
При нажатии клавиши GRAPH MODE "взводим" флаг режима ввода (переменная m, которая имеет три значения: 0 - обычный режим, 1 - строчные буквы, 2 - EXT MODE и 3 - GRAPH MODE).
Пишем что-то типа: IF m=1 THEN IF k>65 AND k<86 THEN LET k=k+79 : GO TO печать символа. Т.о. при нажатии буквенной клавиши будет отрисован символ псевдографики.
Остальное - аналогично.

ZEman
28.08.2016, 20:37
null_device, спасибо так работает.
хотя и не совсем так как надо.
выводятся символы в "G" режиме от A до U.
а как быть с графическими символами которые в цифрах ?

null_device
28.08.2016, 20:53
ZEman, тут, ситуация обстоит немного сложнее, ибо, отображаемые символы и коды клавишь, идут не подряд. Пишете похожую конструкцию, но подставляете другие значения: IF m=1 THEN IF k>48 AND k<56 THEN LET k=k+80 : GO TO печать символа. Остальные символы придется задавать индивидуально.

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

Destr
29.08.2016, 09:18
Наиболее логичным подходом, является составление таблиц соответствия отображаемого символа и нажатой клавиши для каждого режима. Тогда отпадает необходимость написания сложных конструкций.
Да и вообще если по-уму то сперва накалякать свой скан-опрос клавы и будет щастье.
Заодно влепить туда антидребезг и задержки как удобней. Терминал тоже жизнь облегчит.

ZEman
03.09.2016, 09:57
подскажите пожалуйста, как можно подправить текст в программке чтобы отрисовывались только две самые нижние строки из памяти.
пример во вложении.

goodboy
03.09.2016, 10:13
не очень понял вопрос.
в нижних (служебных) строчках можно печатать через print#0;

ZEman
03.09.2016, 10:23
да, в нижних служебных строчках.
только печатаются там не взятые с потолка значения, а взятые из памяти спектрума.
во вложении просто заменил на "255".

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

goodboy
03.09.2016, 10:42
не пойму как такое реализовать.
http://savepic.ru/11270649.png
http://savepic.ru/11258361.png

ZEman
03.09.2016, 10:56
вот, так будет проще объяснить.
в этом примере, в памяти хранится картинка из Exolon.
отрисовывается нижняя треть экрана.

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

ой !
в test2
значение adr - изначально равно 34097.

null_device
03.09.2016, 11:05
ZEman, загляните в книжку "...для пользователей и программистов", где описывается строение экрана.
Для графического отрисовывания в отдельных строках экрана, надо рассчитать в какие адреса писать данные (т.к. вертикальные линии изображения строятся не подряд).

ZEman
03.09.2016, 11:08
goodboy, вроде правильно мне ответил, но.
когда я вписал значение A = 34097.
вместо отрисовки двух самых нижних строк из exolon я получил пустые строчки.
:(

goodboy
03.09.2016, 11:32
a=экран
x=(память) !!!

null_device
03.09.2016, 11:39
ZEman, надо вычислять не только - в какую ячейку экрана писать, но и вычислять, откуда брать данные (а, они хранятся в таком же виде).

ZEman
03.09.2016, 11:46
580525805358051

null_device, я именно это и пробую сделать.

goodboy, всё-равно что-то не то выходит.

null_device
03.09.2016, 11:53
ZEman, решение "в лоб" программы отрисовки предпоследней строки.

Пофиксил. Сделал как процедуру отрисовки, в виде подпрограммы.

ZEman
03.09.2016, 12:37
null_device, отлично !
отрисовка прекрасно работает.

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

вот чёрт, у меня башка ща лопнет...
в памяти то хранится всёравно вся картинка (на 6912 байт), или её нижняя треть на 2048 байт.
а как чтобы сохранились только байты из этих 2 нижних строк и их можно было записать на ленту.

null_device
03.09.2016, 12:45
ZEman,
Вариант номер раз: сохраняем только нужные линии. Переносим в область памяти подряд данные с экрана и сохраняемся из этого "буфера". При загрузке проделываем обратное.
Вариант номер два: сохраняем нижнюю треть экрана целиком.

Вопрос в том, что вам нужно сохранять нижние строки экрана, или данные знакогенератора. Вы же вроде создаете генератор шрифта, а там данные хранятся несколько иначе чем данные на экране?

ZEman
03.09.2016, 16:35
вот так я уже сделал UDG-editor

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

это можно сказать финальная версия, всё работает.
только можно сократить размер записываемого экрана.


добавил:
в архиве rararura files - догружаемые файлы для редактора.
шрифты, тексты, наборы udg символов, картинки для большого режима.
их можно любые использовать.

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

исправил пару ошибок и обновил отрисовку экрана.

БОЛЬШОЕ СПАСИБО ВСЕМ КТО ПОМОГАЛ МНЕ !

ZEman
16.09.2016, 19:18
обновил UDG-editor.
добавил сдвиг символов (вниз или вправо), индикатор работы caps lock, улучшил текстовый редактор, исправил кучу мелких ошибок, объединил сохранения файлов и загрузки, добавил сетку в big mode и многое другое.
провёл довольно сильную оптимизацию программы.
скачать - смотрите вложение.

есть пара вопросов.
я несколько удивлён работой команды RND, это что ложная случайность или нет ?

например вот так работает RND:

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

и ещё вопрос, что размещается по адресам начиная примерно с 65270 ?

Alex Rider
16.09.2016, 23:45
что размещается по адресам начиная примерно с 65270 ?
Машинный стек, стек GO SUB, символы UDG.

как работает этот генератор случайных чисел (RND).
SEED = (SEED + 1) * 75 % 65537 - 1, результат равен SEED / 65536. (% - остаток от деления). RND вычисляет значения циклически, поэтому при одинаковых входных данных (а SEED после сброса всегда равно 0) RND будет выдавать одинаковые последовательности. Оператор RANDOMIZE без параметров копирует в SEED байты из системного таймера, а поскольку от сброса до этого RANDOMIZE происходит случайное и не повторяющееся значение тиков, то можно сказать, что RANDOMIZE инициализирует цепочку значений случайным образом. Если же, наоборот, надо генерировать случайные, но одинаковые цепочки, можно выполнить RANDOMIZE n, где n - "номер" такой цепочки (новое значение SEED). Примерно так работает генератор островов в SIM CITY.

null_device
17.09.2016, 18:25
я несколько удивлён работой команды RND, это что ложная случайность или нет ?

Сама по себе фенкция выдает псевдослучайные последовательности. Если перед этим использовалась RANDOMIZE n, будет сгенерирована одна и та же последовательность, а в переменной SEED будет лежать двухбайтовое представление числа n. Использование оператора без параметров, заносит туда двухбайтовое значение переменной FRAMES (младших байт).

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


что размещается по адресам начиная примерно с 65270

В обычной машине, после перезагрузки, с 65367 лежит знакогенератор UDG. Под ним, от значения переменной RAMTOP, к младшим адресам двигается стек.

ZEman
17.09.2016, 19:18
обновил UDG-editor до 1.5 версии.
исправил мелкие ошибки, добавил на основной экран возможность сохранять в screen обычные символы а не только UDG.
наконец-то, просидел несколько часов но зато сделал сохранение и вывод screen более компактным, теперь он занимает всего 512 байт (2 строки) вместо 2048 байт.
освободилось ещё место, сдвинул адреса на 1.5 килобайта.

старый screen не загружайте, он не подойдёт к программе.

скачать, смотрите вложение.

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

null_device
17.09.2016, 19:39
кто знает самый простой способ вывода сетки ?

Если нужно отрисовать "шахматку" на чистом экране (не сохраняя значение INK и PAPPER) - самое простое, записать в область атрибутов 384 раза с шагом 2 значения с погашенным и включенным байтом яркости.
Либо, руками набить строку в 32 символа, с включенными атрибутами.


чтобы и максимально мало байт занимала и быстро выводилась.

На бейсике такое маловероятно. Либо быстро, либо мало занимало места.

ZEman
17.09.2016, 19:54
Либо, руками набить строку в 32 символа, с включенными атрибутами.
в основном я как-то так и делал, но приходится вставлять 2 строки с разной расстановкой пробелов разной яркости, иначе сетки не будет - работает но занимает многовато.
сделал с использованием команды FOR - занимает меньше места, но выводится на экран долго.
ещё бесит немного то что чем больше программа занимает тем медленней она работает, приходится всячески извращаться и искать нестандартные пути.

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

кстати знаю такой прикол, если при вводе текста на спектруме включить Extend mode а потом нажать цифры или другие символы, можно получить различные цвета (Papper, Inc) для текста и даже мигание.
а вот яркость или прозрачный цвет сделать можно ?

null_device
17.09.2016, 20:01
ZEman, яркость мигание и "транспарантные" цвета задаются аналогично. В первом снапшоте из вложения выше, так и сделано.

ZEman
17.09.2016, 20:09
null_device, спасибо, второй файлик в твоём вложении занимает всего 142 байта.
у меня выходило 215 байт.
а вот первый снапшот слишком большой.


яркость мигание и "транспарантные" цвета задаются аналогично.
задаются, а яркость чтоб менять через extend - что нужно нажимать ?

goodboy
17.09.2016, 20:43
На бейсике такое маловероятно. Либо быстро, либо мало занимало места.
наверно можно вспомнить о перемещении буфера принтера на экран.
поэксперементируйте с

POKE 23681,88
LPRINT "что угодно"

null_device
17.09.2016, 20:48
яркость чтоб менять через extend - что нужно нажимать ?

EXT MODE 9 - включить яркость
EXT MODE 8 - выключить яркость

ZEman
17.09.2016, 20:56
null_device, чтот не выходит, вопросики печатаются и всё.

null_device
17.09.2016, 21:04
ZEman, включаете режим нажав оба шифта, а потом нажимает одну из цифровых клавиш.

ZEman
18.09.2016, 19:28
подскажите пожалуйста способ, как вычислить сколько свободного места в памяти спектрума ещё осталось.
например если я устанавливаю clear 60000, какой максимальный размер у бейсик программы тогда получится ?
частенько бывает сталкиваюсь с тем что программа написана, запустишь её и в какой-то момент выводится out of memory и приходится искать чтобы урезать или компактней сложить.

goodboy
18.09.2016, 20:04
если я устанавливаю clear 60000
в памяти кроме программы на-бейсике и UDG что-то ещё есть ?
(у меня сложилось впечатление что ты оперируешь цифрами наугад)

ZEman
18.09.2016, 20:25
я уже выкладывал прогу, на прошлой странице.
clear у меня там стоит на 61829.
кроме самого бейсика в ту область заносятся:
screen: (так я назвал две служебные строки в которых может находится любая графика) размер 512 байт, начинается с 61830.
font: три шрифта из art studio (любые догружаются) - начинаются с 62350 по 768 байт каждый. заканчиваются на 64658.
text: текст набранный в редакторе, полный экран с 0 по 21 строчки - начинается с 64660, длина 704 байта.
udg: udg-символы 65368 длина 168 байт.

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

да, забыл добавить, размер проги теперь 36689 байт.

null_device
18.09.2016, 20:46
ZEman, читайте переменные VARS и PROG. Вычтя из первого, второе - унаем длину бейсик программы. Непосредсвенно свободная область после бейсик переменныех нчинается со значения WORKSP. Или, наберите PRINT 65536 - USR 7962, вроде, как должно показывать количество свободной памяти в байтах.

goodboy
18.09.2016, 20:58
clear у меня там стоит на 61829.
кроме самого бейсика в ту область заносятся:
ну тогда получается у тебя свободно килобайта полтора
.................
можно начать экономить на формате хранения чисел,
использовать
NOP PI вместо 0
SGN PI вместо 1
кажется в пакете SuperCode был подобный автоматизатор

null_device
18.09.2016, 22:28
goodboy, я уже советовал ТС, отказаться от многобуквенных переменных и по возможности использовать одни и те же локальные переменные.

кажется в пакете SuperCode был подобный автоматизатор
Вопрос в том - хватит ли свободной памяти для его работы.

ZEman, могу на досуге вручную "перебрать" вашу программу исключив "лишние" операторы и попытаться уменьшить обьем листинга.

goodboy
18.09.2016, 23:24
точечный оптимизатор сокращает прогу примерно на 1600байт
и самое главное в отличии от VAL незамедляет обработку строк

http://savepic.ru/11405387.png

ZEman
19.09.2016, 03:35
После работы попробую уменьшить размер проги, даже байт 200-300 прилично увеличит продолжительность работы проги.
Можно ещё конечно run или сlear куда-то добавить, но боюсь что тогда все переменные обнулятся.
Вобщем буду стараться оптимизировать.

Bedazzle
19.09.2016, 06:52
После работы попробую уменьшить размер проги

113 строк комментариев -> больше 2кб


6502 BORDER 4: PAPER 7: INK 0: BRIGHT 1: CLS

похоже, пора такие штуки переносить на подпрограммки в машкоде

ZEman
19.09.2016, 09:27
А разве Remы так много занимают ?
:v2_dizzy_aaaaa
Я их использую для разделения программы на части чтоб не путаться, где, что.

Bedazzle
19.09.2016, 11:10
А разве 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


цикл копирования



LD HL, 61830 ; 3 байта
LD DE, 20672 ; 3 байта
LD BC, 64 ; 3 байта
LDIR ; 2 байта
RET ; 1 байт

итого: 12 байт


ну и вызов процедурки через rand usr val "...." - 10 байт,
что в итоге даст размер меньший, чем бейсиковское сообщение "подождите 40 сек"

ZEman
19.09.2016, 16:43
ну чтож, по сравнению с тем что было мне удалось освободить 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 байт, созданных вами или загруженных откудато ещё.

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

Bedazzle
19.09.2016, 16:52
вроде-бы это всё, дальнейшее развитие программы

Похоже, где-то нелатиницей сообщения написаны.
https://i.imgur.com/PrYy9py.png

ZEman
19.09.2016, 17:16
Странно, если смотреть через эмулятор в снапшоте или тапке то такой ошибки в тексте нет.
Видимо здесь виноват Punto switcher - очень полезная, хотя иногда и вредная прога.

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

Мне интересно вот что.
Объясню на простом примере.
Допустим в какойто проге используется 10 переменных (let, for и.т.д.)
Каждая из этих переменных оперирует числами от 1 до 100.
Там установлен clear - допустим 60000.
а теперь собственно вопрос - 10 переменных по (максимум) 100 байт - это в пределах одного килобайта получается.
Так-вот будет там свободное место всегда, в любом случае уменьшаться до конца (out of memory) или же место будет отедаться только в определённом куске памяти в пределах одного килобайта ?

goodboy
19.09.2016, 20:55
для хранения чисел в-памяти используется 5ти байтная форма.
любая переменная в памяти займет (5+длина её имени).

на этом способе основана экономия памяти и защита/запутанность программ.
на экране видим print usr 0
а в пятибайтной форме скрыто совсем иное число.
(выше я показал как можно все цифры скрыть точками)

Alex Rider
19.09.2016, 21:22
Так-вот будет там свободное место всегда, в любом случае уменьшаться до конца (out of memory) или же место будет отедаться только в определённом куске памяти в пределах одного килобайта ?
В твоей формулировке "до конца". Текст программы и переменные хранятся в общем пространстве памяти, отдельных лимитов для переменных нет. Область переменных идет за текстом программы и двигается к старшим адресам при добавлении новых строк. При выполнении DIM, LET, FOR, INPUT BASIC выполняет присваивание и, если находит переменную подходящего типа, копирует новое значение поверх старого, если не находит - создает новую переменную (и увеличивает занятую ими область вплоть до out of memory). Крмое того, за областью переменных следует так называемая рабочая область, в которой хранятся значения переменных сложных типов (строки, массивы). Так что out of memory может случаться при присваивании даже если переменная уже есть, но стала "больше" (строка длиннее, массив больше).

Bedazzle
19.09.2016, 21:30
точечный оптимизатор сокращает прогу примерно на 1600байт

а где такой надыбать можно?

ZEman
20.09.2016, 03:44
Эмм..
То есть, если я правильно понял, память в процессе работы любой программы всёравно неизбежно уменьшается, так ?
Но в таком случае, уменьшение размера любой программы бессмысленно, всё-равно в итоге будет "out of memory".
Как-же тогда поступают другие, есть способ очистки данных ?
Можно конечно использовать clear или run, но тогда все переменные полетят к чертям.

Reobne
20.09.2016, 06:25
память в процессе работы любой программы всёравно неизбежно уменьшается
Ответ уже есть

выполняет присваивание и, если находит переменную подходящего типа, копирует новое значение поверх старого

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

Просто не делай:
10 go sub 10
или
10 let a$=a$+" go!": goto 10
;)

Bedazzle
20.09.2016, 09:13
Кстати, чутка ускорить (особенно в циклах) работу бейсиковой программы можно,
если использовать
а) однобуквенные переменные
б) переменные в верхнем регистре
в) правильно расположив порядок декларации переменных (чтобы часто используемые находились быстрее)
г) в циклах использовать подмену системной переменной, которая хранит адрес следующей строки (подробности тут (http://www.worldofspectrum.org/forums/discussion/53229/speeding-up-programs-by-hacking-the-sysvars#latest))

ZEman
20.09.2016, 09:22
После работы приду, повожусь ещё с программой.
Уберу не только комментарии но и сами remы - это даст ещё байт 400, а потом надо будет сокращать некоторые переменные до одного символа.
Во всех for буду по возможносьти использовать какую-то одну букву.
Но, я думаю и так работы программы хватит на долго.

Bedazzle
20.09.2016, 09:55
Но, я думаю и так работы программы хватит на долго.

Давай вывод на экран сделаем вставками на асме?
Я помогу с подпрограммками.

Alex Rider
20.09.2016, 13:03
То есть, если я правильно понял, память в процессе работы любой программы всёравно неизбежно уменьшается, так ?
Помимо

если находит переменную подходящего типа, копирует новое значение поверх старого
могу добавить, что

Так что out of memory может случаться при присваивании даже если переменная уже есть, но стала "больше" (строка длиннее, массив больше).,
а, если строка или массив становится короче (например, let a$=""), то память освобождается.

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


Во всех for буду по возможносьти использовать какую-то одну букву.
Это круто сэкономит память - переменная for занимает в памяти 19 байт. Вообще, почитай про струкруру всякого в BASIC'е вот тут (http://zxpress.ru/book.php?id=116) ("Формат хранения текста программы на Бейсике", совсем немного, но доступно, там же и про переменные). Поймешь что сколько байт занимает и на чем можно сэкономить. Предыдущая глава тоже, кстати, пользительная, она рассказывает что где в памяти лежит.

ZEman
20.09.2016, 13:42
Да я уже понял что forы довольно много занимают, но они очень удобные, чем их ещё заменишь.
С помощью let s=s+1.... И.т.д. медленно бывает.
А никакого способа нет чтоб безболезненно очищать память ?
Чтобы переменные нужные не дохли и память хоть немного освобождалась.
Зачем например в памяти откладываются операции по выполнению фором или letами, они ведь уже прошли.

null_device
20.09.2016, 14:41
ZEman, возможно уже писал, но повторюсь. При написании большой программы на бейсике, стоит использовать однобуквенные переменные и по возможности один и те же имена для локальных подпрограмм. Чтобы не возникало ситуации, когда переменная задействуясь в какой-либо части программы, более нигде не используясь, занимала память.


Зачем например в памяти откладываются операции по выполнению фором или letами, они ведь уже прошли.
В бейсике, все переменные являются глобальными. Будучи, хоть один раз заданной, к ней можно обращаться в любой момент выполнения программы.
Значение циклов, может использоваться как возврат в тело цикла, если в процессе его выполнения, был осуществлен переход оператором GOTO или GOSUB из тела цикла. Опять же - значение переменной цикла может понадобиться в случае "аварийного" выхода из него.

Alex Rider
20.09.2016, 14:42
Зачем например в памяти откладываются операции по выполнению фором или letами, они ведь уже прошли.
Увы, переменные не уничтожаются после использования потому что интерпретатор никогда не знает где значения этих переменных могут понадобиться вновь.

ZEman
22.09.2016, 16:40
sorry, что так долго не выкладывал, простыл, сижу с температурой :(

лан, лучше позже чем никогда.

Rararura 1.5.1

-оптимизация программы.
-удалил все Remы кроме двух с копирайтами.
-все forы теперь for g=...
-удалил несколько бесполезных строк.

теперь программа занимает вместо 36689 байт, всего 34808 байт.
также во вложении необходимые для работы программы файлы.

Bedazzle
22.09.2016, 17:04
Rararura 1.5.1

уже ведь была 1.5.1 ?

ZEman
22.09.2016, 17:30
Ну это тоже, здесь ведь ничего нового нет кроме оптимизации.

Bedazzle
22.09.2016, 20:15
Ну это тоже, здесь ведь ничего нового нет кроме оптимизации.

а в чём тайный смысл такой подробной нумерации, если её не использовать? :)

ZEman
23.09.2016, 09:45
уговорил :)
незнаю что ещё можно придумать, пока додумался лишь до..

Rararura 1.6.0 (beta)
- отделил от программы clear и poke 23658,8 в загрузчик, после которого загружается сама программа.
- освободилось ещё 40 байт :)

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

есть маленькая непонятка:
загружаю лоадер, затем гружу саму прогу, в самой программе нет автостарта.
в конце загрузки программы мне выдаётся "С nonsense in BASIC, 2:1"
хотя после команды run всё отлично работает.
так-же если я загружаю после лоадера программу с автостартом на 2 строку - ошибки нет.
в чём проблемма ?

Bedazzle
23.09.2016, 12:30
далее буду сокращать переменные, может ещё что придумаю.


давай вставки на асме сделаем




загружаю лоадер, затем гружу саму прогу, в самой программе нет автостарта.
в конце загрузки программы мне выдаётся "С nonsense in BASIC, 2:1"


в эмузвин в режиме 48к без ошибки загрузилось

ZEman
23.09.2016, 12:42
хе-хе, а у emuzwin походу точность эмуляции похуже будет чем у zxspin.
в emuzwin после загрузки, курсор всё-равно стал обычным, в zxspin нет.

zxmak 2 тоже выдал ошибку и сохранил курсор в "С".

goodboy
23.09.2016, 14:12
загружаю лоадер, затем гружу саму прогу, в самой программе нет автостарта.
в конце загрузки программы мне выдаётся "С nonsense in BASIC, 2:1"
а откуда бейсику знать о подмене текста программы ???
он тупо выполняет LOAD "" и переходит к изучению очередного байта,
а там скорее всего что-то типа =0
вот он и выдаёт ошибку

по-хорошему надо делать принудительное переключение на 48ое ПЗУ,
в 128ом прога выглядит странновато
(там пара UDG зарезервирована под токены)

ZEman
25.09.2016, 20:54
два дня потихоньку вычищал прогу, получилось весьма неплохо.

Rararura 1.6.0
- clear и режим "С" курсора вынесены в загрузчик.
- освободил ещё 503 байта места.
- подавляющее большинство переменных переведены в однобуквенные формы. также все forы теперь for g=...
- исправил пару мелких ошибок в main menu.
- программа теперь работает немного быстрее чем раньше.

проверил работоспособность, довольно долго делал всё что можно, out of memory - не появился и места ещё прилично было.
во вложении сама прога и файлы которые можно догружать (их можно самому создать сколько угодно).
как теперь получилось, что скажете ?

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

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

ZEman
30.09.2016, 14:27
всё, финальная версия проги.
из-за того что болел занимался очень немного, но вот что получилось.

Rararura 1.6.0a
- освободил ещё байт 200 места.
- исправил небольшую ошибку в отрисовке шрифтов.
- ещё больше переменных перевёл в 1-буквенный вид.
- программа стала работать немного быстрее.

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

есть вопросик, ни у кого из ранее скачивающих эту прогу не сохранился случайно архив что я выкладывал на 4 странице 04.08.2016 (сообщение №33) ?

Bedazzle
30.09.2016, 17:46
есть вопросик, ни у кого из ранее скачивающих эту прогу не сохранился случайно архив что я выкладывал на 4 странице 04.08.2016 (сообщение №33) ?

только такое есть:

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

ZEman
27.10.2016, 19:06
всё-таки ещё раз обновил прогу и наконец выкладываю здесь.

Rararura 1.6.1

немного изменил отрисовку больших спрайтов.
исправил ошибку в copy symbol mode.
слегка изменил меню about.
добавил memory test (показывает сколько памяти осталось).
небольшая оптимизация программы.
добавил мануал к программе.

в вложении кроме самой программы находится мануал и различные загружаемые файлы для примера.

ZEman
14.02.2017, 18:29
наверное это финальная версия.
обновил прогу ещё раз.

Rararura 1.7.0

- добавлена загрузка внешнего модуля.
- улучшен memory test.
- улучшенна обработка спрайтов в big mode.
- улучшенна очистка экранов программы.
- оптимизация программы.

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

есть некоторые ограничения:
программа внутри модуля должна начинаться со строки 8500 и может длиться до строки номер 8799 включительно.
выход из модуля желательно делать на строку номер 5.
модуль должен иметь размер до 2.5 кб НЕ БОЛЕЕ !
в противном случае памяти может не хватить.

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

во вложении сама программа файлы для примера и мануал.

ZEman
26.02.2017, 11:00
снова обновление.

Rararura 1.7.1

- исправлена ошибка при работе с модулем.
- мелкие исправления и оптимизация.

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

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

во вложении сама программа файлы для примера и мануал.

ZEman
05.06.2017, 14:38
я что-то нифига понять не могу, почему так.
три способа опроса клавиш.

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 байт занимала ?

jerri
05.06.2017, 15:01
ZEman, 18 байт потому как цифры требуют +6 байт

меньше 12
if inkey$=a$ then

но a$ чота занимать тоже будет

Black Cat / Era CG
05.06.2017, 16:26
LET IK= CODE INKEY$
10 IF IK=65 THEN
Ну потому что 65 это #36 #35 #0E #00 #00 #41 #00 #00

null_device
05.06.2017, 17:54
Почитайте книгу "... Для пользователей и программистов". Ту, главу, в которой описывается формат хранения переменных. Должно помочь.
Есть вариант числа пихать в функцию VAL$. Правда, это потребует хранение переменной K$ в виде числовой переменной, либо и ее пихать в фукцию VAL$. Побочный эффект, работает медленнее.
Почти все ухищрения связанные с уменьшением обьема программы, палка о двух концах, которая помимо затруднения чтения листинга, замедляет работу программы.

ZEman
05.06.2017, 18:11
понял уже.
хотя мне всё-же удалось ещё освободить прилично места в программе и провести кое-какую оптимизацию, прога стала работать явно быстрее.
так-что скоро будет 1.7.2 версия.

null_device
05.06.2017, 21:06
есть ли ещё способ опроса клавиш, что меньше 12 байт занимала ?

Чисто на бейсике, подобную конструкцию, врятли можно оформить как-то короче.
Можно попробовать использовать значение переменной, как аргумент команды перехода. Правда, в плане экономии памяти, не все так очевидно, ибо потребуется использовать пространство в 256 с чем-то строчек и "команды-заглушки".

10 LET K= CODE INKEY$
12 GOTO 20+K
....
52 GO TO 10
....
68 GO TO (ЕСЛИ НАЖАТА КЛАВИША "0")
....
275 GOTO 10

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


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

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

ZEman
15.07.2017, 18:28
прошу помощи.
вопрос такой:
даётся переменная в виде числа от 0 до 255.
в моём случае Let g= ... (число от 0 до 255).
как можно перевести её в двоичную систему ?
должно получиться число в виде восьми нулей и единиц.

Shiny
15.07.2017, 18:38
BIN

null_device
15.07.2017, 18:42
Шынни, данная команда, переводит числа из двичной формы в десятичную. Не наиборот.

ZX_NOVOSIB
15.07.2017, 18:48
ZEman, то, что тебе нужно zx-бейсик не умеет, умеет токо наоборот с помощью BIN.

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

Хотя наверно можно составить какую-то хитрую подпрограммку, которая будет юзать poke/peek и выводить, что тебе нужно.

ZEman
15.07.2017, 18:52
неужели нет никакой формулы чтоб применить в программе можно было ?

null_device
15.07.2017, 18:59
ZEman, загляните в книжку: "как написать игру на бейсике". Там есть пример.

Либо:

10 LET n="число которое надо перевести"
15 LET n$=""
30 IF n>127 THEN LET n$=n$+"1": LET n=n-128: GOTO 40
35 LET n$=n$+"0"
40 IF n>63 THEN LET n$=n$+"1": LET n=n-64: GOTO 50
45 LET n$=n$+"0"
50 IF n>31 THEN LET n$=n$+"1": LET n=n-32: GOTO 60
55 LET n$=n$+"0"
60 IF n>15 THEN LET n$=n$+"1": LET n=n-16: GOTO 70
65 LET n$=n$+"0"
70 IF n>7 THEN LET n$=n$+"1": LET n=n-8: GOTO 80
75 LET n$=n$+"0"
80 IF n>3 THEN LET n$=n$+"1": LET n=n-4: GOTO 90
85 LET n$=n$+"0"
90 IF n>1 THEN LET n$=n$+"1": LET n=n-2: GOTO 100
95 LET n$=n$+"0"
100 IF n>0 THEN LET n$=n$+"1": LET n=n-1: GOTO 110
105 LET n$=n$+"0"
110 PRINT n$

Black Cat / Era CG
15.07.2017, 18:59
Формула есть. Только оно ж тормозно будет.

baxter
15.07.2017, 19:02
10 DEF FN V(x,y)=x-y*INT (x/y)
20 DEF FN b$(b)=STR$ INT (b/128)+STR$ INT (FN V(b,128)/64)+STR$ INT (FN V(FN V(b,128),64)/32)+STR$ INT (FN V(FN V(FN V(b,128),64),32)/16)+STR$ INT (FN V(FN V(FN V(FN V(b,128),64),32),16)/8)+STR$ INT (FN V(FN V(FN V(FN V(FN V(b,128),64),32),16),8)/4)+STR$ INT (FN V(FN V(FN V(FN V(FN V(FN V(b,128),64),32),16),8),4)/2)+STR$ INT FN V(FN V(FN V(FN V(FN V(FN V(FN V(b,128),64),32),16),8),4),2)
30 INPUT "input num 0 to 255 ";a
40 PRINT FN b$(a)

ZEman
15.07.2017, 19:03
null_device, угу видел такое, но оно слишком громоздкое.
видимо придётся пойти на хитрость и использовать что-то типа poke 22400 (g) - где g число от 0 до 255.
и получившеюся черту переводить в двоичное число.

goodboy
15.07.2017, 19:07
похоже надо мудрить в цикле 0-7 со степенями двойки и десятки

null_device
15.07.2017, 19:09
ZEman, громоздкое? Зато не использует сложных вычислений. И относительно быстрое.
Если вы собираетесь использовать отображение бинарного числа линией пикселей и команды POINT, врятли получится короче и быстрее. К тому же ЕМНИП, команда не работает со служебной частью экрана...

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

Black Cat / Era CG
15.07.2017, 19:19
Могу сделать маленькую процедурку в коде. Раз забить ее через POKE и потом вызывать, предварительно положив нужное число через POKE и установив место вывода через PRINT AT x,y; Будет точно быстрее.

ZX_NOVOSIB
15.07.2017, 19:29
В конкурсах бейсик-игр процедурки в кодах под запретом, например.

ZEman
15.07.2017, 19:30
большое спасибо за советы, но я уже сам разобрался с данной задачкой.
просто думал что может есть простенькое решение в виде одной строчки формулы.
на днях выложу новую версию rararura, хотя нового там не так уж и много.

Black Cat / Era CG
15.07.2017, 19:32
В конкурсах бейсик-игр процедурки в кодах под запретом, например.
Ну дык это ж спорт - специальная олимпиада.

ZX_NOVOSIB
15.07.2017, 19:37
ZEman, в бета-бейсике есть оператор переводящий из десятичной в двоичную )

null_device
15.07.2017, 20:00
ZX_NOVOSIB, только вот, сам он "сьедает" килобайта три, если не больше.

Black Cat / Era CG
15.07.2017, 20:02
ZEman, а надо было перевести в строку, а то я печаталку сделал :)

Shiny
15.07.2017, 20:39
Двоичное число: 2^7*d7+2^6*d6+2^5*d5+...+2^0*d0, здесь d7-d0 двоичные числа.

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

или так:
http://i93.fastpic.ru/big/2017/0715/cd/b8b638e9f33b0a572b994849dce408cd.png61655

Black Cat / Era CG
15.07.2017, 20:49
или так:
Ага. 4 строчки по сути.

Shiny
15.07.2017, 21:28
Ага. 4 строчки по сути.
20-40?

есть и другой способ, привели выше.

Black Cat / Era CG
15.07.2017, 21:31
20-40?
есть и другой способ, привели выше.
20-90
Да куча способов. Просто на барсике (если код не подключать) все они довольно тормозные же.

Shiny
15.07.2017, 21:45
2 килобайта спасут прекалком(:

Reobne
18.07.2017, 18:22
Компромис между скоростью и прекалком:


10 DEF FN c$(a)=z$(1+a TO 4+a)
20 DEF FN b$(n)=FN c$(INT (n/16)*4)+FN c$((n-INT (n/16)*16)*4)
25 LET z$="00000001001000110100010101100111100010011010101111 00110111101111"

Shiny
21.07.2017, 10:25
Компромис между скоростью и прекалком:

а если хватит 2048 байт для строки, то будет b$(n*8 to n*8+7) или примерно так.

Reobne
21.07.2017, 11:05
Или даже двухмерный символьный массив сделать. :)

ZEman
30.07.2017, 07:43
пришло время для очередного обновления.
хотя добавлено немного и скорее всего больше обновлений не будет.

Rararura 1.8.0

- добавлен Data symbol mode режим.
- оптимизация программы.

Data symbol mode режим - перевод из численного значения (0 - 255) в строку для UDG символа.
вызывается этот режим клавишей "Х".

во вложении сама программа файлы для примера и мануал.

ZEman
02.08.2017, 19:03
прошу помощи.
вопрос такой - как можно вернуть строчке в листинге программы обычный (стандартный) цвет ?

например имеем 2 строки:

10 print "text"
20 print

в 10 строке слово текст написаано с использованием закраски.
то-есть я вхожу в extend mode и нажимаю цифру (например 2) придавая фону текста красный цвет.
беда в том что последующие строчки тоже окрашиваются в красный цвет.
можно задать любой цвет экрана (paper) но строчки будут цветные.
а мне нужно чтоб они были стандартными прозрачными, как это можно сделать ?

shurik-ua
02.08.2017, 19:07
в конце строки нажать extend mode и нажать "7".

ZEman
02.08.2017, 19:24
строка станет белой.
если я после этого сделаю например

paper 5 : cls

то получим голубой экран и на нём белая строка.
а должна быть прозрачная (обычная)

наберите любой листинг и меняйте цвет экрана.
строчки всегда будут иметь тотже фон что и экран.

shurik-ua
02.08.2017, 19:54
видимо никак - а зачем в процессе фон менять то ?

ZEman
02.08.2017, 19:56
как-то можно, мне встречались программки с таким листингом, а вот как получается такой фокус непонятно.

creator
02.08.2017, 20:56
ZEman, 8 — прозрачный цвет. Как ввести с клавиатуры не знаю, просто ввёл тот же красный цвет, а затем сделал poke 23768,8.

null_device
02.08.2017, 21:10
ZEman, войти в тот же самый EXT MODE и набрать управляющие коды INK 8 и PAPER 8 (ЕМНИП, второе работает через зажатый шифт).

Black Cat / Era CG
02.08.2017, 21:46
войти в тот же самый EXT MODE и набрать управляющие коды INK 8 и PAPER 8
Ненене так не работает. Так управляются BRIGHT и FLASH с клавы.

creator
02.08.2017, 23:59
Я смотрю в таблице на второй столбик "Набор на клавиатуре" и у меня шуршит шифер. Что это за бредятина?

http://i93.fastpic.ru/big/2017/0803/70/797910792212250f140b392c1d61a070.jpg
http://i94.fastpic.ru/big/2017/0803/3c/14258cdd7ddee269fd82db6d179d383c.jpg

Black Cat / Era CG
03.08.2017, 00:14
Я смотрю в таблице на второй столбик "Набор на клавиатуре" и у меня шуршит шифер. Что это за бредятина?
Не. Там ваще чета не то написано.

null_device
03.08.2017, 11:59
Black Cat / Era CG, согласен, так не работает. Зато, через управляющие коды работает, если ввести число 8 после команды аттрибутов.

ZEman, значит, единственный вариант: вручную переправить значения после кодов 16 и 17.

Black Cat / Era CG
03.08.2017, 12:23
Кароч можно через POKE ну. Или диск-доктор/монитор-отладчик...

женя999
12.10.2017, 17:00
Всем добрый вечер,я задам тут свой вопрос,подскажите такую вещь ,вот недавно включил эмулятор ,решил пописать программки на любимом бэйсике,к удивлению пальцы все помнят,да и голова не совсем еще отупела. Вот какой вопрос: не придумал ли какой нибудь добрый человек такую программу чтобы можно было писать на бейсике в каком нибудь другом окне,чтобы можно было ставить метки ,чтобы шрифт был меньшего размера ,чтобы строчек было больше видно ,чтобы можно было пользоваться мышью при написании,ну вопщем как например в purebasic или visalbasic,но чтобы можно было так же сразу запускать и проверять как всё это дело работает . надеюсь поняли то что я хотел спросить. спасибо .

BYTEMAN
12.10.2017, 17:10
женя999, BASin?

женя999
12.10.2017, 17:29
не понял я про BASin

ZX_NOVOSIB
12.10.2017, 17:33
женя999, да, BASin или ещё ZX Editor (http://www.zx-modules.de/zxeditor/zxeditor.html) есть.

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


не понял я про BASin
редактор такой ) Поищи в гугле.

женя999
12.10.2017, 17:37
Спасибо посмотрю

ZEman
12.10.2017, 19:50
самая последняя версия утилиты Basin.
https://sites.google.com/site/ulaplus/home/zx-spin-and-basin

женя999
13.10.2017, 10:09
ура !!!

ZEman
23.12.2017, 23:23
После долгого затишья обновляю снова свою программу.

Rararura 1.8.1

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

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

во вложении сама программа, дополнительные файлы и мануал.

baxter
10.01.2018, 17:21
Как на бейсике, максимально просто, можно инвертировать байт?

Black Cat / Era CG
10.01.2018, 17:23
255-x?

baxter
10.01.2018, 17:36
А икс чему равен?
Всю голову сломал, не могу додуматься.

Black Cat / Era CG
10.01.2018, 17:40
Тот самый байт, который инвертировать, вычитаем из 255, получаем инверсию в результате.
11111111 - 00000101 = 11111010
11111111 - 10100000 = 01011111

baxter
10.01.2018, 17:46
Спасибо! Оказывается так просто. А я хотел уже на биты разбивать.

baxter
26.02.2018, 13:03
Как из 48го щелкать страничками, и какие могут быть "подводные камни"?

Shiny
26.02.2018, 13:06
128й бейсик, наверное.

страничками щелкал так:


31 out 32765,19:poke 23388,19:pause 1

baxter
26.02.2018, 13:11
Спасибо! Теперь бы разжувать бы. Как для ААА.

Shiny
26.02.2018, 13:54
http://speccy.info/Порт_7FFD

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

или тут:
https://spectrumcomputing.co.uk/forums/viewtopic.php?f=6&t=197

null_device
26.02.2018, 15:30
Как из 48го щелкать страничками, и какие могут быть "подводные камни"?

ЕМНИП, если произведен "холодный" запуск 48К конфигурации - средствами самого бейсика, никак. Порт, оказывается "залочен" для записи.
В противном случае, маш.код - в помощь (системной переменной порта конфигурации-то, все равно нет).

baxter
26.02.2018, 18:37
Имеется ввиду с открытым портом.

Shiny
26.02.2018, 18:43
после usr0 в бейсике128?

или выполнена известная процедура перехода в режим 48?

goodboy
26.02.2018, 18:44
стек и программа должны быть ниже 49152.
лучше используй рамдиск на 128к

baxter
26.02.2018, 19:01
У меня на эве вместо 128го квик зашит, да и не люблю я этот басик.

Shiny
26.02.2018, 19:12
шо, даже OUT отсутствует?

null_device
26.02.2018, 20:44
baxter, посмотрите, как сделано переключение страниц в демке POWER UP (https://www.zxaaa.net/view_demo.php?id=2768).

baxter
27.02.2018, 09:48
Где то видел подобный загрузчик, но никак не мог найти.
null_device, спасибо!

ZEman
09.03.2018, 14:56
ещё обновление.
продолжается работа над программой Rararura и Я на этот раз выкладываю сразу 2 версии программы под номерами 1.8.2 и 1.9.1.
рекомендую использовать именно 1.9.1.

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

1.8.2 (28.01.2018)
- улучшенна отрисовка и запись screen.
- изменён способ загрузки и размещения в памяти шрифтов для copy symbol mode.
- исправленна ошибка с выбором шрифта в copy symbol mode.
- оптимизирован режим поворота символов.
- исправления в меню сохранения на ленту.
- исправления в caps lock режиме.
- улучшена обработка спрайтов в big mode.
- выделен курсор в big mode.
- удалены некоторые дублирующие строки в программе.

1.9.0 (13.02.2018)
- сдвиг clear на 59389.
- добавлен режим Complete.
- добавлен режим клонирования udg символов.
- добавлен звуковой сигнал при выборе символа в big mode.
- исправления в caps lock режиме.
- исправления в memory test.
- изменения в главном меню.
- удалено использование модуля.
- выделен курсор на сетке 8х8.
- улучшена отрисовка символов.
- изменён способ создания UDG символов.

1.9.1 (09.03.2018)
- добавлен выбор символа.
- исправленна ошибка в copy symbol mode.
- исправленна ошибка в create new font mode.
- в снимок памяти добавленны метки о состоянии create new font mode,
screen, text, символ для сетки, big sprite.
- теперь big sprite сохраняется в снимке памяти.
- изменён способ отрисовки символов в режиме поворота символов.
- исправленна ошибка о номере выбранного шрифта в copy symbol mode.
- улучшено управление курсором в big mode (небольшой прирост скорости).
- улучшено управление курсором на сетке 8х8 (небольшой прирост скорости).
- изменён способ отрисовки сетки в big mode (сетка рисуется в 3 раза быстрей).
- изменён способ отрисовки сетки 8x8.
- оптимизация программы.

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

из новинок в 1.9.1

-выбор символа - теперь вместо звёздочки (по умолчанию) можно использовать любой другой символ.
нажмите "S" в меню выбора "create new symbol or edit any symbol".

-клонирование символа.
при выборе "edit any symbol" нажмите клавишу "N" - позволит клонировать символ.

- complete.
режим создания картинки из частей.

так-же теперь в снимок памяти сохраняются все данные о big sprite, text, screen, выбранный символ, сохраняется прогресс из create new font mode.
в результате снимки памяти подходят любые для старых версий до 1.9 включительно.
для 1.9.1 снимки памяти подойдут только от 1.9.1 версии.
если хотите использовать старые снимки памяти в новой версии - воспользуйтесь утилитой snap-converter.

Alex Rider
10.03.2018, 17:02
ZEman, есть предложение: все сообщения начиная с некоторого твоего поста-анонса переносим в новую тему "rararura - <описание продукта>". Получаем тред продукта. Пост этот первый оформляешь как типичный анонс продукта: описание, история изменений, вложения с версиями. Чтобы легко было найти и скачать. А первые сообщения - они действительно по вопросам в бейсике, пусть так и остаются темой для вопросов и ответов.

ZEman
10.03.2018, 17:28
я не против, переноси.
название темы пусть будет "Rararura - udg editor+."

Alex Rider
13.03.2018, 18:47
я не против, переноси.
А начиная с которого сообщения переносить все в новую тему? Подскажи плиз.

ZEman
13.03.2018, 20:11
началась эта программа с этого сообщения
http://zx-pk.ru/threads/26828-bejsik-pomoshch.html?p=880896&viewfull=1#post880896

ZEman
11.04.2018, 18:48
подскажите пожалуйста.
как перевести экранный адрес в координату X, Y ?
то-есть например у меня Poke 22528,71 (чёрный квадрат в 0,0)
как это перевести в X=0, Y=0
Poke может быть любым от 22528 до 23232.

Shiny
11.04.2018, 18:54
атрибуты?

poke 22528+x+y*32, значение

Black Cat / Era CG
11.04.2018, 18:58
Вычтите из адреса 22528. Поделите на 32. Целая часть - Y, остаток - Х. Это ж атрибуты, они линейные.

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

Let Y=Int((Addr-22528)/32)
Let X=(Addr-22528)-Y*32

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

Чета я походу не понял, что было нужно)))

ZEman
11.04.2018, 19:10
Black Cat / Era CG, спасибо большое.
я раньше переводил из координат X Y в значение адреса.
а вот наоборот когда понадобилось тут я завис.

char
12.04.2018, 18:39
а чтобы было "ваще", - надо завести два массива (или даже две строковых), по 768 байт, забить их готовыми значениями и по смещению из экрана получать из этих массивов готовые x и y :D
мы не ищщем легких путёв, деления - в топку! )))

a=addr-22527
x=code x$(a)
y=code y$(a)

ZEman
12.04.2018, 21:25
под массивы нужно место, а у меня его как раз очень мало.
поэтому приходится всячески изворачиваться.
потихоньку делаю новую версию (1.9.3) Rararura - добавил туда три новинки, и..
но готова она будет ещё не скоро.

ZX_NOVOSIB
07.05.2018, 20:45
Напомните плиз, если мы делаем бейсик-тр-дос загрузчик, и игра требует CLEAR 24136 , то как вычислить предельный размер бейсик-загрузчика в байтах?

Black Cat / Era CG
07.05.2018, 20:49
Зайди в бейсик. Набей какую-нибудь строку. Из бейсика зайди в тр-дос, выполни ченибудь типа кат, лист. Вернись в бейсик и посмотри в отладчике адрес своей строки.

Shiny
07.05.2018, 20:58
что за методы?
24575 хватает впритык.
а сделать загрузку через функцию 5 точки #3D13 никак?


а строчка будет по адресу $5D40 наверное.

Black Cat / Era CG
07.05.2018, 21:04
что за методы?
Спросили, ответил. Адрес не помню. Кстати, вроде б, если выполнить мув, адрес еще сдвинется. И вроде б, если сразу после мув попробовать запустить чета с кодовым загрузчиком в бейсик-строке, то не прокатит. Но могу прогонять.

null_device
08.05.2018, 05:14
Начало бейсик программы: 23635+112 байт переменных TR-DOS+256 байт при операциях работы с диском.
Выполнив команду PRINT 65536-USR 7962 выяснится, что свободного места для загрузчика остается, с гулькин нос.

creator
08.05.2018, 05:47
24575 хватает впритык
24499 хватает впритык. А 24575 просто раздолье. ;)

Начало бейсик программы: ̶2̶3̶6̶3̶5̶+112 байт переменных TR-DOS+256 байт при операциях работы с диском.
peek23635+256*peek23636
23755 без TR-DOS
23867 активный TR-DOS

null_device
08.05.2018, 07:15
creator, само собой - по памяти, указал адрес переменной, а не собственно адрес начала программы на бейсике.

ZX_NOVOSIB
08.05.2018, 11:06
Погодите, слишком много действий и чисел, непонятно откуда берущихся. Вот есть CLEAR 24136 , вот есть начало бейсика при активном тр-досе - 23867 , вычтя из первого второе получим 269 байт под загрузчик. Всё верно? Или я чего-то напутал?

goodboy
08.05.2018, 11:22
получим 269 байт под загрузчик. Всё верно? Или я чего-то напутал?
про буфер (для загрузки секторов) забыл, а это ещё +257байт

null_device
08.05.2018, 11:36
получим 269 байт под загрузчик. Всё верно? Или я чего-то напутал?

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