1. (A<>0) AND (B<>0)
Короткий способ определить,что оба чис─
ла (A и B) не равны нулю.Если хотя бы одно
из них равно нулю,то будет установлен флаг
Z.
ADD A,-1
SBC A,A
AND B
Применено в ACEdit для проверки нажатия
Extend.
2. Как сделать CLEAR?
Подпрограмма CLEAR (её адрес 7863, па─
раметр RAMTOP в BC - см.её вызов,например,
в исходнике mrip ) предназначена для при─
менения из интерпретатора бейсика и потому
не полностью формирует стек, из кодов её
можно вызывать только при условии невозв─
рата в бейсик. Если вы хотите возвращаться
в бейсик, вам нужно:
1. SP=RAMTOP-23.
2. Скопировать 24 байта стека бейсика по
адресу SP. Они всегда одинаковые, привожу
их:
#2d2b
#3365
#2758
#10ed
#d (или #3e, если выполнялся не по─
следний оператор в строке)
#9
#1c85
#1c10
#1b52
#1b76
#1303
#3e00
3. Занести значение RAMTOP'а в ячейки
23730/31 (они как раз называются RAMTOP ).
4. Занести значение RAMTOP-3 в ячейки
23613/14 (они называются ERRSP ).
Вот и всё! Можете даже не очищать эк─
ран,хотя стандартная подпрограмма очищает.
Ещё бейсиковская подпрограмма чистит пере─
менные и что-то другое делает, но оно нам
не надо...
3. Как изменить длину бейсика?
Адреса, которые надо заполнить, я уже
приводил в IG#5 - в статье про автосборку.
Теперь поясню, что это за адреса:
(23635) PROG - начало бейсика.
(23627) VARS - конец бейсика.Для пустого
бейсика равен PROG. Для пустых переменных
по этому указателю лежит #80.
(23641) E_LINE - адрес буфера редактиру─
емой строки. Для пустой области переменных
равен VARS+1. Для пустого буфера редакти─
руемой строки по этому указателю лежит #d,
#80. Это содержимое не важно при выходе
через RST 8 и не важно для сохранения бей─
сика на диск. (Предыдущая #80 тоже не важ─
на для сохранения.)
(23649) WORKSP - адрес рабочего стека
(что это,мне не известно).Для пустой обла─
сти редактируемой строки равен E_LINE+2. С
этого адреса TR-DOS выделяет память под
свои нужды.
(23651) STKBOT - адрес стека калькулято─
ра. По моим наблюдениям, равен WORKSP+12.
(23653) STKEND - конец стека калькулято─
ра. Для пустого равен STKBOT.
4. Автоопределение включенной страницы
Применяется в моём TR-DOS v6b09e вместо
старой проверки по 16-битному ключу (в ко─
торой часто случались ошибочные определе─
ния). У меня ключ 32-битный.
LD DE,(#C000)
LD HL,(#FFFD)
PUSH HL
LD BC,#7FFD
LD (#C000),BC
LD (#FFFD),BC
XOR A
nxtpg
AND #C7
DEC A
AND #C7
OR 16
OUT (C),A
LD HL,(#C000)
SBC HL,BC
JR NZ,nxtpg
LD HL,(#FFFD)
SBC HL,BC
JR NZ,nxtpg
LD (#C000),de
POP HL
LD (#FFFD),HL
;A=page
5. Стрелочка в стратегических играх
Alex Xor>
Как ты выводил курсор в своих исходни─
ках "Allods"? А как выводил курсор Медно─
ногов в ЧВ? Мне нужны просто сами принци─
пы. Знаю,что твой принцип и принцип Медно─
ногова различны,но тонкостей не знаю вооб─
ще. Работа должна идти с теневым экраном.
Вячеслав Медноногов>
При обновлении экрана вывод идёт по
строкам сверху вниз.При этом в специальной
переменной запоминаешь номер строки.Стрел─
ка "висит" на прерываниях.При приходе пре─
рывания проверяешь, обновляется ли экран в
данный момент или нет.
Если нет - нет проблем. Если да - воз─
можны три разных варианта: текущая линия
над стрелкой,ниже стрелки,пересекает стре─
лку.
В первом случае - восстанавливаешь изо─
бражение под стрелкой, во втором случае -
не восстанавливаешь,в третьем случае - во─
звращаешь указатель выводимой линии на не─
сколько позиций назад, чтобы свести третий
случай к случаю один.
Alone Coder>
Мой способ:стрелка висит на прерывании,
но имеется возможность напечатать её на
теневом экране.
Если при входе в прерывание обнаружено,
что выводится экран, то рисуем точно такую
же стрелку на теневом экране (CALL ARMAP).
перед этим стираем на нём старую стрелку,
нарисованную через ARMAP (CALL REMAP). За─
чем последнее - не могу сейчас сформулиро─
вать, но это важно (кажется, потому, что
теневой экран выводится более одного фрей─
ма).
Этот исходник я пока сам недостаточно
прочувствовал,чтобы прокомментировать. Вот
фрагмент обработчика прерываний,по которо─
му всё должно быть понятно:
PRSHADF=$+1
LD A,0
DEC A
PUSH AF
CALL Z,REMAP
CALL PRAR
POP AF
CALL Z,ARMAP
Alex Xor>
А печать экрана происходит где? Ведь не
внутри прерывания?
Alone Coder>
Разумеется,снаружи,абсолютно не связано
с прерываниями.
Alex Xor>
А как ты отсчитывал прерывания, чтобы
потом вывести?
Alone Coder>
Не отсчитывал, тот исходник работал,как
ЧВ - в турбо ускорялось всё :)
6. Вложенные DISP
Вложенные DISP...ENT в ALASM'е делаются
так:
DISP смещ1
... (по основному смещению)
ad0
DISP смещ2
ad1
... (по внутреннему смещению)
DISP ad0+$-ad1
... (продолжаем по осн.смещению)
ENT
Используется при разработке прошивок
ПЗУ или других программ со сложным распре─
делением памяти (которые нельзя компилиро─
вать туда, откуда они исполняются).
A. Coder