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. Она печатает нес-
колько строк в заданных координатах. Можно
использовать для печати меню, описаний и
т.д.