PDA

Просмотр полной версии : Системные переменные BASIC 48



SaintTurnip
28.04.2018, 20:34
Мне нужно 3-4 байта в безопасной (в режиме бейсика 48) области памяти.

Системные переменные расположены в диапазоне 23552 to 23733.

Можно ли как-нибудь сдвинуть эту область вниз или вверх на несколько байт?

UPD: хочу расширить себе фирмварь, но не теряя совместимости с существующим софтом.

Andrew771
28.04.2018, 20:46
Насколько я помню, если не используется ZX-принтер, можно использовать его буфер безнаказанно.

Spectramine
28.04.2018, 21:17
Мне нужно 3-4 байта в безопасной (в режиме бейсика 48) области памяти.

Системные переменные расположены в диапазоне 23552 to 23733.

Можно ли как-нибудь сдвинуть эту область вниз или вверх на несколько байт?

Нет, нельзя. Системные переменные жестко привязаны к адресам. Но можно уменьшить объем бейсик-памяти командой CLEAR X, и память выше X можно будет безопасно использовать. Также, как уже указали, в режиме 48 бейсика можно относительно безопасно использовать область буфера принтера 23296-23551, если не использовать вывод на ZX-принтер. Ну и ещё можно зарезервировать место после REM в бейсик-строке, но тогда придется находить адрес этой строки в памяти.

SaintTurnip
28.04.2018, 22:24
Может забрать себе что-нибудь не очень нужное?

На мой взгляд, главный кандидат это область 23734...(CHANS) - буфер интерфейса-1 или микродрайва. Но если влоб записать значение в CHANS, можно испортить бейсику жизнь. Как бы задействовать эту область? В ПЗУ пять или шесть обращений к регистру CHANS (5C4F), а упоминаний 23734 (5CB6) еще меньше. Но сходу не могу понять, с чем оно пересекается и по какой причине.

КАРТА МИКРОДРАЙВА - Если к Вашему компьютеру подключен ZX интер-
фейс-! , то с адреса 23734 до адреса, на 1 меньшего, чем содержимое
CHANS, находится карта микродрайва - область, используемая как буфер
для трансляции данных, как набор добавочных системных переменных и
т.п. Если интерфейс не подключен, то эта область попросту не сущеет-
вуpi - переменная CHANS содержит адрес 23734. Она определяет начало
блока памяти, в котором содержатся данные о существующих каналах.

23728, обработчик юзер-НМИ. Он чем-нибудь используется в реальности?
23728 NMIADD This is the address of a user supplied NMI address which is read by the standard ROM when a peripheral activates the NMI.
Probably intentionally disabled so that the effect is to perform a reset if both locations hold zero, but do nothing if the locations hold a non-zero value.
Interface 1's with serial number greater than 87315 will initialize these locations to 0 and 80 to allow the RS232 "T" channel to use a variable line width. 23728 is the current print position and 23729 the width - default 80.

23732, последний адрес ОЗУ. 16 кб уже давно неактуально, можно смело засунуть заглушки во все места, где идет чтение этих ячеек. Правда как разные там программы отреагируют.
23732 P RAMT Address of last byte of physical RAM.

23656, которая указывает на область памяти калькулятора. Насколько опасно зафиксировать это значение?
N2 23656 MEM Address of area used for calculator's memory. (Usually MEMBOT, but not always.)

Destr
29.04.2018, 01:15
Можно в UDG на крайняк :)

Bedazzle
29.04.2018, 01:17
23348-23383 ?

SaintTurnip
29.04.2018, 01:49
Можно в UDG на крайняк :)


хочу расширить себе фирмварь, но не теряя совместимости с существующим софтом.




23348-23383 ?

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

Spectramine
29.04.2018, 07:56
хочу расширить себе фирмварь, но не теряя совместимости с существующим софтом.


Это надо было упомянуть в стартовом посте. NMI_ADD нужна для выставления собственной процедуры обработки немаскируемого прерывания. Но из-за ошибки в ПЗУ она не используется. Так что, если не планируется использование немаскируемого прерывания, или, как минимум, перехват его обработчика после исправления ошибки в ПЗУ, её можно юзать.

P_RAMT - указатель на адрес верха физического ОЗУ. Естественно, на исправной машине от 48к в ней всегда #FFFF. Используется она командой CLEAR. Может, теоретически, использоваться расширителями Бейсика.

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


Я занимался расширением ПЗУ в своё время. Для своих задач я использовал под переменные верх буфера принтера. Да, программы могут затирать его, но для моих целей это было некритично.

Имейте ввиду, некоторые программы используют содержимое ПЗУ для декодирования своих загрузчиков, а некоторые тесты - для расчета контрольных сумм, так что расширение фирмвари ВСЕГДА ведет к некоторой потере совместимости.

Кроме того, и это более важно, очень много программ использует свободное место в ПЗУ как таблицу векторов прерывания IM 2 (сходу вспомню Bomb Jack и Rambo). Допись туда своего кода ведет, естественно, к потере работоспособности этих программ - с этим столкнулись пользователи клонов с расширенным ПЗУ, а также пользователи оригинальных +2А/+3. Частично проблему можно решить, оставляя байты #FFFF хотя бы по адресам #3XFF-#3XFF+1, т.к. на исправной машине без подключенной редкой периферии (AMX Mouse) на шине данных в момент прерывания всегда #FF.

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

SaintTurnip
29.04.2018, 17:33
Ценный ответ, weiv!

Где может использоваться NMI? Моя тема это Спектрум 48, так что скорпионы и прочие не актуальны.

Spectramine
29.04.2018, 18:27
Для использования NMI на компьютере должна быть как минимум кнопка NMI, посылающая сигнал на процессор. NMI может, например, использоваться расширением ПЗУ для входа в встроенный в ПЗУ монитор, как в Турбо90. Или (тоже расширением ПЗУ) для выгрузки дампа игры на ленту по нажатию на кнопку NMI.

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

Если нужна только флаговая информация - можно поискать неиспользуемые биты в флаговых системных переменных.

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

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

SoftFelix
29.04.2018, 18:33
можно использовать его буфер безнаказанно.
При условии, что будет грузится через USR 0 из BASIC48. Это при наличии TR-DOS. Имхо, все командеры и буты грузят из BASIC128 по умолчанию и вот тут возможны проблемы и глюки. Даже если использовать RES 4,(IY+1) перед запуском программы. И тем более нельзя использовать буфер принтера при наличии ПРОФ-ПЗУ и СМУКа.

SaintTurnip
30.04.2018, 01:51
Пытаюсь раскрасить вывод RST #10, но получается только управляющими кодами или напрямую атрибутами.

В первую очередь пробовал регистр 23693, но почему-то без результата: команды PRINT в бейсике он раскрашивает, а

LD A, 57
LD (23693), A
LD A, 65
RST 16

выводит черным. После стирания экрана всё синеет, как и положено, но мне надо без стирания.

Есть ли способ устанавливать INK для RST #10 вызовом чего-нибудь?

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

Syntax highlighting - в ногу со временем!

https://scontent-arn2-1.xx.fbcdn.net/v/t1.0-9/31488334_10214336944990170_7548104200450914057_n.j pg?_nc_cat=0&oh=0fcd00f9cc080287ce1eb0ab6fe92299&oe=5B502D85

SfS
30.04.2018, 04:13
Круть)

Shiny
30.04.2018, 05:46
а управляющий INK не помогает?

goodboy
30.04.2018, 10:19
LD A, 57
LD (23693), A
LD A, 65
RST 16

выводит черным.
засылай цвет в (23695)

SaintTurnip
30.04.2018, 15:46
Шынни, управляющий это ASCII 16+код цвета? Очень медленно. Это четыре дополнительных RST 16 на каждый выводимый элемент:
засылаем 16 -> RST 16
меняем цвет -> RST 16
засылаем букву -> RST 16
засылаем 16 -> RST 16
восстанавливаем цвет -> RST 16

goodboy, ВОУ ВОУ! ЭТО РАБОТАЕТ И РАБОТАЕТ БЫСТРО И НЕ НАДО ВОССТАНАВЛИВАТЬ ЦВЕТ ПОСЛЕ ВЫВОДА!

Главное я же баклан пробовал 23695, но из бейсика:
10 poke 23695, 57
20 print "attr-t blue"
30 poke 23693, 58
40 print "attr-p red"

И вот 23693 работал, а 23695 не работал, и я забил на него вообще.

А потом оказалось, что 23693 не работает с RST10.

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

Поправка: цвет восстанавливать надо.

Shiny
30.04.2018, 16:54
Шынни, управляющий это ASCII 16+код цвета? Очень медленно. Это четыре дополнительных RST 16 на каждый выводимый элемент:
Нет, код, потом цвет.

Чо медленно? мозги не парь себе и окружающим и пиши на ассемблере без пзу.

SaintTurnip
30.04.2018, 17:25
Шынни, чувствую недопонимание. Изложи пожалуйста пример на асме, как вывести красную букву А, а потом вернуть цвет на 0

goodboy
30.04.2018, 17:41
я честно говоря даже не вникал в логику работы процедуры печати.
просто поставил в эмуле прерывание на запись в область аттрибутов и понял откуда берётся значение для цвета

Spectramine
30.04.2018, 18:50
Нет, код, потом цвет.

Чо медленно? мозги не парь себе и окружающим и пиши на ассемблере без пзу.

Пишется расширение ПЗУ.

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

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

А ещё, подумалось, круто было бы оформить расцветку синтаксиса загружаемым с ленты расширением Бейсика, переназначая вывод на экран через потоки/каналы. Так этим расширением могли бы пользоваться все.

AndTorp
04.05.2018, 15:49
нельзя использовать буфер принтера при наличии ПРОФ-ПЗУ и СМУКа
SoftFelix, как Scorpion использует буфер принтера?

Alex Rider
09.05.2018, 15:29
Если нужна только флаговая информация - можно поискать неиспользуемые биты в флаговых системных переменных.
Нет, оно так не работает - ПЗУ не всегда работает с отдельными битами флаговых переменных.

Всё-таки, лучше наверно использовать часть области STRMS, предварительно с нею разобравшись, там 38 байт, думаю, что-то можно найти.
Да, это хороший и часто используемый вариант. Без интерфейса-1 из этой области используются первые 14 байт.
Есть еще переменная, которая у Ларченко и Родионова обозначена как NOT_USED - старший байт позиции каретки принтера. Но я на 100% не уверен, что эта переменная нигде не перетирается.

SaintTurnip
09.05.2018, 15:43
в итоге использовал 23729 (NMIADD)