Из журнала Deja Vu #07, Кемерово, 1999 (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. Она печатает нес- колько строк в заданных координатах. Можно использовать для печати меню, описаний и т.д.