CODING - Процедура печати группы тектстовых строк из Бейсика.

Deja Vu #07
AY-Track: LOW CODER'S LYRIC (ON FUNTOP'98)
__________________________________________


(C) Стрельников Андрей
__________________________________________


        Процедура печати


   В программах на Basic'e часто использу-
ются процедуры печати  в  машинных  кодах.
Для этого их подключают к новому каналу  и
печатают обычным PRINT, либо  размещают  в
ОЗУ заранее подготовленные сообщения и пе-
редают в процедуру печати их адрес  с  по-
мощью POKE. Предлагаю другой  способ. Дан-
ные передаются через функцию пользователя.
Текст  размещается  в  REM  строках. Адрес
текста расчитывается по номеру первой 1-ой
строки с текстом. Символ конца текста  от-
сутствует. Конец текста  определяется  ОТ-
СУТСТВИЕМ оператора REM в начале следующей
Basic строки. В качестве  примера  привожу
несложную  процедуру  печати, использующую
ПЗУшную RST 16.

; процедура печати группы текстовых  строк
; из Бейсика.
; (с) Стрельников А.С.
; def fn a(n, x, y, t, p, b) = adr
; n - номер первой строки с текстом
; x,y - координаты
; t,p,b, - атрибуты (ink, paper, bright)
; символ конца строки 13 (ВК)
; текст размещается за оператором REM в
; нескольких строках.
; печатаются строки пока не встретится
; строка, которая начинается с другого
; (не REM) оператора.

      ORG  40000
      LD   A,2
      CALL 5633  ; открываем канал 2

; определение адреса 1-ой строки текста

      LD   HL,(23563) ;defadd
      INC  HL
      INC  HL
      CALL 13236
      CALL 7833
      PUSH BC
      POP  HL
      CALL 6510
      LD   DE,5
      ADD  HL,DE ;теперь в HL адрес текста
                 ;после REM

;установка атрибутов печати

      LD   IX,(23563)  ;Defadd
      LD   A,16
      RST  16
      LD   A,(IX+28)   ;ink
      RST  16
      LD   A,17
      RST  16
      LD   A,(IX+36)   ;paper
      RST  16
      LD   A,19
      RST  16
      LD   A,(IX+44)   ;bright
      RST  16


;установка позиции печати

      LD   B,(IX+12)   ;x
      LD   C,(IX+2)    ;y
START LD   A,22        ;at
      RST  16
      LD   A,C         ;y
      RST  16
      LD   A,B         ;x
      RST  16


;печать

PRN   LD   A,(HL) ;взяли символ
      CP   13     ;проверка на код ВК
      JR   2,PS   ;если да-к процедуре пе-
                  ;ревода строки
      RST  16     ;печать символа
      INC  HL     ;увеличиваем указатель
                  ;текста
      JR   PRN    ;печать след. символа

;перевод строки: увеличиваем y на 1
;адрес увеличиваем на 5 (переходим к  сле-
;дующей строке, где  после  REM  находится
;текст: 2 байта номер строки, 2 байта дли-
;на строки и 1  байт - код  13  предыдущей
;строки).

PS    INC  C       ;y=y+1
      LD   DE,5
      ADD  HL,DE   ;adr=adr+5
      LD   A,(HL)  ;если здесь
      CP   234     ;код REM - пропускаем
      INC  HL      ;его и печатаем
      JR   Z,START ;следующую строку, если
                   ;нет - сброс
END   CALL 3405    ;временных атрибутов
      RET          ;выход

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