Info Guide
#07
31 мая 2005 |
|
For Coderz - Маленькие программерские хитрости.
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
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября