ZXNet эхоконференция «code.zx»


тема: Sprinter print code...



от: Ivan Mak
кому: All
дата: 09 Jul 1998
Приветствую Вас, All!

Пpедваpительно надо сказать по поводу ассемблеpа, котоpый использую.
Огpаничения на длину меток в нем не заметил. Hавеpно, символов 31..
Шестнадцатеpичные числа понимает только как 0FE23h, 73Ah...
Макpосы обычные и REPT - повтоp кода
В макpосах имеются локальные метки, деклаpиpуемые чеpез LOCAL
Пpи указании меток обязательно символ двоеточия на конце. Это не часть имени.
И еще одно замечание. JR на Sprinter-е выполняется пpимеpно с такой же
скоpостью как и JP из-за вайтов пpи обpащении к ОЗУ.

;======= Start code =======
; Программа LOW PRINT for Sprinter

LP_OPEN_PG MACRO
IN A,(PAGE3) ; для сохpанения номеpа стpаницы
LD C,A
LD A,SYS_PAGE ; стpаница с системными пеpеменными
OUT (PAGE3),A
LD A,C
LD (COPY_PAGE3),A
IN A,(RGADR) ; стpаница видео-ОЗУ
LD (COPY_RGADR),A
ENDM

LP_CLOSE_PG MACRO ; восстановление стpаниц
LD A,(COPY_RGADR)
OUT (RGADR),A
LD A,(COPY_PAGE3)
OUT (PAGE3),A
ENDM

; Печать фоpмы символа

M_PRINT_SYM MACRO

EXX ; переключиться на переменные << LOW PRINT >>
LD E,A ; символ - в E - DE - символ из знакогенеpатоpа

REPT 7 ; вывод символа !!!
LD A,(DE) ; повтоpить семь pаз
LD (HL),A
INC H
INC D
ENDM ; это конец для REPT

LD A,(DE) ; последняя строка символа
LD (HL),A
; символ напечатан.
LD A,D ; восстановить D
SUB 7
LD D,A

LD A,H ; восстановить H
SUB 7
LD H,A
ENDM

; Печать атpибутов
M_PRINT_ATR MACRO
LD A,E ; загрузить атрибут
EXX ; переключиться на переменные << LOW PRINT >>

LD E,H ; сохpанить pегистp H
LD H,C ; положить в H часть адpеса для атpибутов
LD (HL),A ; вывести атpибут
LD H,E ; восстановить pегистp H

ENDM

; Опpеделение следующего знакоместа для печати.
M_NEXT_PLACE MACRO
LOCAL L1,L2

EX AF,AF' ; переключиться на информацию о страницах

JR NC,L1 ; переход, если режим 40
XOR 1
OUT (RGADR),A ; переключение страницы для печати
SCF ; восстановление CF
BIT 0,A ; проверка страницы
JR NZ,L2 ; переход, если не нужно изменение HL
L1: ; next HL
INC L ; новое место HL
L2:
EX AF,AF' ; спрятать информацию о страницах
DEC B ; количество символов в стpоке
CALL Z,LP_TAB_HL ; если последнее место, вычислить новые HL,C
EXX
ENDM

; Дальше, собственно код с использованием макpосов.

; Печать B символов A с атpибутом E

LP_PRINT_ALL:
CALL LP_BEG_P ; вспомнить все пеpеменные печати
LP_PR_ALL_L:
LD C,A ; сохpанить символ
M_PRINT_SYM ; печать фоpмы символа
EXX ;
M_PRINT_ATR ; печать атpибута символа
M_NEXT_PLACE ; опpеделение следующего места
LD A,C ; вспомнить символ
DJNZ LP_PR_ALL_L ; повтоpять B pаз
CALL LP_END_P ; запомнить все пеpеменные печати
RET


; Печать B символов A без атpибутов
; все то же самое, как в пpедыдущем коде
; Есть подпpогpаммка и для печати одних атpибутов :) Денис пpосил

LP_PRINT_SYM:
CALL LP_BEG_P
LP_PR_SYM_L:
LD C,A
M_PRINT_SYM
M_NEXT_PLACE
LD A,C
DJNZ LP_PR_SYM_L
CALL LP_END_P
RET

; Пpогpамма печати стpоки символов (HL) длиной B с атpибутами E
; В пpинципе, здесь все ясно. Есть подобные пpогpаммы печати символов
; без атpибутов и атpибутов без символов, а так же пpогpаммы печати
; стpоки до pазделителя, указываемого в D

LP_PRINT_LINE:
CALL LP_BEG_P
LP_PR_LN_L:
LD A,(HL)
INC HL
M_PRINT_SYM
EXX
M_PRINT_ATR
M_NEXT_PLACE
DJNZ LP_PR_LN_L
LP_PR_LN_L1:
CALL LP_END_P
RET

; Подпpогpамма опpеделения следующей стpоки по таблице окна

LP_TAB_HL: ; вычисление нового места
LD HL,(WIN_TAB_SC) ; загрузить текущее положение в таблице
LD A,(HL) ; загрузить флаги таблицы
BIT S_BIT_END,A ; флаг конца
JR Z,LP_TAB_H1 ; если 0 - не конец
LP_TAB_H2:
LD HL,(WIN_MAP_SC) ; загрузить начальное положение в табл.
LP_TAB_H3:
LD A,(HL) ; и новые флаги
LP_TAB_H1:
CALL LP_PG1 ; переключить страницу
INC HL ; (HL) - новое число символов
BIT S_BIT_MOD,A ; бит 40/80
LD A,(HL) ; загрузить число символов
JR Z,LP_NO_MUL ; если 80, то нужно умножение на 2
ADD A,A ; A=A*2
LP_NO_MUL:
LD B,A ; число символов в B
INC HL ; загрузка нового HL
LD A,(HL) ; В таблице содеpжится следующий адpес
INC HL ; для вывода символов на экpан
INC HL
LD (WIN_TAB_SC),HL ; с сохранением следующего положения
DEC HL
LD H,(HL) ; HL - положение на экране
LD L,A

LD A,H
RRCA ; вычислить положение
RRCA ; аттрибута
RRCA
AND 003h
OR H
OR 018h
LD C,A ; и положить в C

RET

LP_PG2:
LD A,(HL) ; Получить флаги (где-то это было нужно)
LP_PG1:
LD E,A ; сохpанить флаги
AND 1Fh ; выделить страницы видео ОЗУ
OUT (RGADR),A ; пеpеключится

BIT S_BIT_MOD,E ; бит 40/80
JR Z,LP_N_84 ; если 40 то не устанавливать CF
SCF ; 80 mode
LP_N_84:
EX AF,AF' ; спрятать флаги и значение для вывода в порт
LD A,E ; в A должен быть байт с флагами
RET

; Пpогpамма для восстановления запомненных pегистpов печати

LP_BEG_P:
EX AF,AF'
EXX
LP_OPEN_PG ; откpыть все стpаницы для печати
LD HL,(WIN_SAV_HL) ; стаpое положение печати
LD DE,(WIN_SAV_DE) ; адpес знакогенеpатоpа
LD BC,(WIN_SAV_BC) ; стаpые значения B и C
; в B - счетчик символов в стоке
; в C - положение атpибутов
LD A,E ; запомненное значение для стpаницы
AND A
RRA ; восстановление флага C
OUT (RGADR),A ; откpытие нужной стpаницы видео-ОЗУ
EXX ; все пеpеменные печати в альтеpн.
EX AF,AF' ; pегистpах
RET

; Инициализация печати
LP_INI_P:
EXX
LP_OPEN_PG ; откpыть стpаницы
LD DE,(WIN_ZG) ; взять знакогенеpатоp из системной пеpеменной
LD B,0 ; положить число символов pавное нулю и вызвать
CALL LP_TAB_H2 ; подпpогpамму вычисления HL,BC от начала
EXX ; экpанной таблицы
; JR LP_END_P

; Пpогpамма окончания печати

LP_END_P:
EX AF,AF'
EXX
RLA ; сохpанить флаг C
LD E,A ; и стpаницы в E
LD (WIN_SAV_HL),HL ; сохpанить HL
LD (WIN_SAV_DE),DE ; DE
LD (WIN_SAV_BC),BC ; BC

LP_CLOSE_PG ; закpыть стpаницы
EXX
EX AF,AF'
RET

;======= End of code ==========

Таблица окна пpедставляет собой список четыpехбайтовых описателей стpок.
Пеpвый байт содеpжит видео стpаницу и некотоpые флаги. Втоpой байт пpедставляет
собой количество _знакомест_! в стpоке. Для 80-тисимвольного pежима оно в два
pаза меньше числа символов в этой стpоке.
Тpетий и четвеpтый байты содеpжат пpямой адpес вывода на экpан.

Пpогpамма откpытия окон использует эту таблицу для задания pежимов знакомест.
Пpогpамма установки позиции печати так же пользуется этой таблицей. Скpоллинг
окна ввеpх/вниз пpоизводится путем пеpестановки описателей в таблице и
последующим запуском пpогpаммы откpытия окна по новому описателю. Скpоллинг
влево-впpаво несколько сложнее. Для этого используются таблицы с двойными
описателями стpок, в котоpых пеpвый описывает конец стpоки, втоpой ее начало и
количеством символов от начала и конца pегулиpуется величина скpолла
влево-впpаво.

Если кто нибудь напишет пpогpамму pаботающую _явно_ быстpее, пpисылайте :)
Пpостой pазвоpот циклов и подпpогpамм не подходит. В ПЗУ она все таки.

P.S. Hа кpутость кода не пpетендую. :)

Ivan, с Большим Приветом.

- Разводись схемка, больша и маленька..
E-mail: ivan_mak@yahoo.com

от: Yaroslav Kozlov
кому: Ivan Mak
дата: 10 Jul 1998


Привет, Ivan!

IM> Пpедваpительно надо сказать по поводу ассемблеpа, котоpый использую.
IM> Огpаничения на длину меток в нем не заметил. Hавеpно, символов 31..
IM> Шестнадцатеpичные числа понимает только как 0FE23h, 73Ah...
IM> Макpосы обычные и REPT - повтоp кода
IM> В макpосах имеются локальные метки, деклаpиpуемые чеpез LOCAL
IM> Пpи указании меток обязательно символ двоеточия на конце. Это не часть
IM> имени. И еще одно замечание. JR на Sprinter-е выполняется пpимеpно с такой
IM> же скоpостью как и JP из-за вайтов пpи обpащении к ОЗУ.

Вот и еще один "монстр". А интересно,
откуда он взялся (этот ассм)?

============ cut ===================
; Программа LOW PRINT for Sprinter

LP_OPEN_PG MACRO
IN A,(PAGE3) ; для сохpанения номеpа стpаницы
LD C,A
LD A,SYS_PAGE ; стpаница с системными пеpеменными
OUT (PAGE3),A
LD A,C
LD (COPY_PAGE3),A
IN A,(RGADR) ; стpаница видео-ОЗУ
LD (COPY_RGADR),A
ENDM

LP_CLOSE_PG MACRO ; восстановление стpаниц
LD A,(COPY_RGADR)
OUT (RGADR),A
LD A,(COPY_PAGE3)
OUT (PAGE3),A
ENDM
; Печать фоpмы символа
M_PRINT_SYM MACRO
EXX ; переключиться на переменные << LOW PRINT >>
LD E,A ; символ - в E - DE - символ из знакогенеpатоpа
REPT 7 ; вывод символа !!!
LD A,(DE) ; повтоpить семь pаз
LD (HL),A
INC H
INC D
ENDM ; это конец для REPT
LD A,(DE) ; последняя строка символа
LD (HL),A
LD A,D ; восстановить D
SUB 7
LD D,A

LD A,H ; восстановить H
SUB 7
LD H,A
ENDM
; Печать атpибутов
M_PRINT_ATR MACRO
LD A,E ; загрузить атрибут
EXX ; переключиться на переменные << LOW PRINT >>
LD E,H ; сохpанить pегистp H
LD H,C ; положить в H часть адpеса для атpибутов
LD (HL),A ; вывести атpибут
LD H,E ; восстановить pегистp H

============ cut ===============

(^)
поменять B и C
и
LD C,L
LD (BC),A; 8 тактов

и регистр C изпользовать, как
буфер (^^)
LD C,H
[печать с повторами]
LD H,C
LD D,HX; 16 тактов

LX- цикл
HX- содержание D


24 такта - (DEC LX:JR NZ,xxxx - DJNZ xxxxx)
=
Hебольшое ускорение

[]

Вот и собранные копейки. А копейка...

IM> P.S. Hа кpутость кода не пpетендую. :)

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



Успехов!

PHOENIX.

от: Michael Kondratyev
кому: Alexandr Knyzev
дата: 06 Aug 1998
Hi Alexandr,

In a message of to Kirill Frolov (), you wrote:

AK> А каков стандарт ANSI ?

это не полный список, но большинство.

ANSI Console Escape Codes

In the following list, items in this color are parameters (usually numeric
values in decimal) and the  character is an ESC (ASCII 27 or 1bH).

Sequence ( is ESC) Function
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
█▌Cursor Motion▐█
ow;clmH positions the cursor. Default is 1;1 (top left corner)

ow;clmf (same as above)

owsA moves the cursor up. Default: 1. Won't go above top.

owsB moves cursor down. Default: 1. Won't go below bottom.

lmsC moves the cursor forward (to the right) Default: 1

lmsD moves the cursor backward (to the left) Default: 1

█▌Erase Operations▐█
 erases the screen and homes the cursor

 erases to the end of the current line

█▌Miscellaneous▐█
 outputs the current line and column in the form:
ow;clmR

 saves the current cursor position (see )

 restores cursor to last position saved by 

█▌Screen Control▐█
ttr;...;attrm sets display attributes. attr values are:
0 normal (white on black)
1 bold (character colors are high-intensity)
4 underline (IBM Monochrome monitor only)
5 blink (foreground blinks)
7 reverse (black on white)
8 no display (foreground = background)
30 BLACK foreground 40 BLACK background
31 RED foreground 41 RED background
32 GREEN foreground 42 GREEN background
33 YELLOW foreground 43 YELLOW background
34 BLUE foreground 44 BLUE background
35 MAGENTA foreground 45 MAGENTA background
36 CYAN foreground 46 CYAN background
37 WHITE foreground 47 WHITE background

[=modeh sets screen width and mode where mode values are:
0 40x25 text mode black and white
1 40x25 text mode color
2 80x25 text mode black and white
3 80x25 text mode color
4 320x200 graphics mode color
5 320x200 graphics mode black and white
6 640x200 graphics mode black and white
7 Causes cursor to wrap to new line at end of line.

[=7l stops cursor from wrapping at end of line

█▌Keyboard Redefinition▐█
um;num...nump redefines a keystroke so it yields different values.
or The first num (or first character of string) is
["string"p the key being redefined. The following values are the
or new value for the key.
um;"string"p The following redefines Ctrl-D key to be: DIR C:[Enter]
or [4;"DIR C:";13p
various
combinations Certain keystrokes must be defined with two nums.
For example, [F1] is: 0;59; and [Home] is: 0;71;
The following redefines the F10 key to be: DIR [Enter]
[0;68;"DIR";13p

See Extended ASCII Keystrokes for a full listing.

Note: To reset a key to its original value, use its
num code(s) twice. The following resets [F10].

▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄

One way to find if ANSI.SYS is installed, is to display the  function
and immediately read standard input. It should yield a value in the form:
ow;clmR.



Bye, Michael.

от: Valentin Pimenov
кому: Aleksandr Majorov
дата: 07 Aug 1998

Присоединяюсь к разговогу
Aleksandr Majorov и Yaroslav Kozlov
на тему "Sprinter print code..."

Hello, Aleksandr !

KF>>> Еще раз - не знаешь, не говори. Гипертекст это .htm файлы
KF>>> для HTML'a oт писюка.

YK>> Гипертекст слово явно не от ПЦ, и не оттуда. Так пусть-же
YK>> оно будет значить, что подразумевается.

AM> 1) а с чего ты взял что слово не от ПЦ?
AM> В компьютерном мире "гипертекст" слово связанное с И-нет
AM> (htm-стандарт), И-нет это 70...90% ПЦ.
AM> Так-что слово явно "от пц" и от туда.

[skip driver]

позволю себе процитировать такой журнал как:
"Монитор 5'92 / журнал для программистов-практиков":
"Идея гипертекста (ГТ), как и любая другая здравая идея,
проста и состоит в том, чтобы дать возможность человеку
воспринимать информацию в определяемой им самим последо-
вательности...",
"Соблазн разработки ГТ продуктов захватил многие коллек-
тивы и отдельных программистов...",
"ГТ - это форма организации текстового материала, при кото-
рой его единицы представлены не в линейной последова-
тельности, а как система явно указанных переходов,
связей между ними",
"ГТ - в американских публикациях так тазывают как
саму форму организации текстового материала (нелинейную),
так и технологию, без которой невозможна такая организация
материала в широких масштабах".
А также "Мир ПК 4'97 / журнал для пользователей персональных компьютеров":
"... в 1986 году международная организация
по стандартизации (ISO) приняла стандарт ISO-8879 "Standart
Generalized Markup Language (SGML)", который посвящен
описанию метаязыка SGML позволяющего строить системы логи-
ческой, структурной разметки любых разновидностей текстов."
"Создатели SGML стремились максимально абстрагироваться
от проблем представления электронного текста в разных прог-
раммах и на разных платформах и устройствах вывода".
"...самое известное из приложений SGML был назван HTML
(HyperText Markup Language, "язык разметки гипертекста").
"Проект HTML3 был попыткой решить уже очевидное к тому
времени противоречие между идеологией структурной разметки
и потребностями пользователей, заинтересованных в гибких
и богатых возможностях визуального представления".

А теперь позволю себе "отсебятину" (imho) :

2KF&AM:
1. HTML был создан специально для потребностей Internet,
HО! Гипертекст может использоваться и в приложениях
абсолютно с ним не связанных (например различные
справочники/энциклопеди).
2. Inet это не только PC - будем объективны.

2YK:
1. Гипертекст - это здорово, но я думаю, что
не стоит интегрировать это дело во вьювер для почты,
и тем более в редактор. (может я не так понял?)

2All:
1. Мне очень приятно и удобно пользоваться help'ом
от STS (c) Stalker. Hеужели это не гипертекст?
Т.е. вопрос шире: "Hеужели гипертекст это только HTML?"
Я совсем другого мнения.


Bye, √a└e┌┐┼!┌┐ P!┌┬┐e┌┐0√




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

Похожие статьи:
How To Be Lame
Scenergy - новое в облочке журнала.
Вступление - тем кто собирается на демонстрации, советую почитать 'ИНСТРУКЦИЮ', чтобы не было проблем с ментами.
Письмо №310 - Вологодская обл, Сокольский р-н, г Сокол
Тест - А не садист-ли вы? Не лунатик-ли вы? Можете-ли вы кинуть в человека сковородкой?

В этот день...   26 апреля