Inferno #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 




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
От авторов - Редакция.
РуSкие пряники - интьервью с известным сценовым художником Dever/4D.
Работа с TR-DOS - Коллекции TR-DOS дискет.

В этот день...   26 сентября