© И. Пивен.
КОРР: Решил вынести на ваш суд свою первую (законченную) процедуру в машинных кодах. Сей релоцируемый программный модуль позволяет выводить на экран 4 любых символа в восьмикратном увеличении (8*4=32, как известно). Надеюсь, на основе моей идеи читатели создадут "BIG RUNLINE" - это, вообще-то, цель письма. Итак, вперед:
; (C) SELINA SPACE 8*8
можно и любой другой адрес подготовка для файла атрибутов
RET - обеспечение релацируемости и
FIR NEX
NEX LIN
DEC |
SP |
|
DEC |
SP |
|
POP |
HL |
|
LD |
BC, 10 |
8 |
ADD |
HL, BC |
|
LD |
A, (HL) |
CP |
255 |
|
JR |
NZ,CONT |
LD |
HL,10072 |
EXX |
|
|
RET |
|
|
INC |
HL |
|
PUSH |
HL |
|
LD |
L,A |
|
LD |
H, 0 |
|
ADD |
HL, HL |
|
ADD |
HL, HL |
|
ADD |
HL, HL |
|
PUSH |
HL |
|
POP |
BC |
|
LD |
HL, (23606) |
ADD |
HL, BC |
|
PUSH |
HL |
|
POP |
DE |
|
EXX |
|
|
ADD |
HL, BC |
|
PUSH |
HL |
|
LD |
B, 8 |
|
PUSH |
BC |
|
LD |
A,(DE) |
INC |
DE |
|
BIT |
7,A |
|
JR |
Z, AA |
|
LD |
(HL) , |
214 |
INC |
HL |
|
BIT |
6,A |
|
JR |
Z,BB |
|
LD |
(HL) , |
214 |
INC |
HL |
|
BIT |
5,A |
|
JR |
Z, CC |
|
LD |
(HL) , |
214 |
INC |
HL |
|
BIT |
4,A |
|
JR |
Z,DD |
|
LD |
(HL) , |
214 |
INC |
HL |
|
BIT |
3,A |
|
JR |
Z, EE |
|
LD |
(HL) , |
214 |
INC |
HL |
|
BIT |
2,A |
|
JR |
Z, FF |
|
LD |
(HL) , |
214 |
INC |
HL |
|
BIT |
1,A |
|
JR |
Z, GG |
|
LD |
(HL) , |
214 |
INC |
HL |
|
BIT |
0,A |
|
JR |
Z, HH |
|
LD |
(HL) , |
214 |
LD |
BC, 25 |
|
ADD |
HL, BC |
|
; расчет адреса сообщения
; получаем STRING
; подготовка или возврат, если END
;расчет адреса матрицы символа
; расчет адреса в файле атрибутов
; количество "огромных" знаколиний для цикла
; байт матрицы в аккумулятор и проверяя каждый бит,
; включаем или не включаем соответствующий байт
; атрибутов.
; 214 - параметры (атрибуты) знакоместа
; переход к следующей "огромной" знаколинии
восстанавливаем параметр цикла не закончили? Тогда на NEX-LINE адрес следующего символа вернули на FIR_NEX начнем сначала.
КОРР: Конечно, не забываю рубрику "ИДЕЯ" и дарю довольно интересную мысль читателям. Вероятно, с самых первых шагов общения с RAM, каждый сталкивается с областью системных переменных, и, в первую очередь, с CHARS. Ну, конечно, у Вас уже мелькнула стереотипная мысль: "CHARS указывает на 256 байтов ниже истинного положения фонта". А почему?! Любой Ваш ответ неверен! На самом деле, CHARS указывает туда, куда надо! Просто процедура печати из ПЗУ не изображает символы с кодами 0...31. Ага! Начинает доходить? Ведь это нужно для работы БЕЙСИКА! А в кодах? Вы собственноручно создаете процедуру печати, которая не игнорирует " контрольные коды" и, таким образом, получаете вдобавок еще 32 символа в Вашем фонте. Создать символы можно в ART STUDIO, указать в CHARS непосредственно на них, а остальной набор загрузить на 256 байтов выше. И все! На базе этой идеи можно создать или доработать текстовый редактор, который, думаю, заинтересовал бы многих.
© Васильев Антон (EARTH SOFTWARE) г. Снежинск
КОРР: Здравствуй уважаемый ИНФОРКОМ! Посылаю вам пару программ - ответов на вопросы Сергея Колотова, а также несколько своих программ.
Итак, сначала ответы: 1. HL= B*C
LD E, C
LD HL,0
LD D,0
ADD HL,DE
DJNZ L1 RET
2. Напечатать символ, код которого в A, атрибутом, заданным в С, на весь экран.
ORG 40000
SUB 32
LD L,A
LD H, 0
LD A, C
LD (L6+1),A
ADD HL, HL
ADD HL, HL
ADD HL, HL
LD DE,15616
ADD HL,DE
LD DE,BUF
LD BC,8 LDIR
LD HL,22528
LD DE,BUF
LD B, 8
PUSH BC
PUSH DE
PUSH HL
LD B, 8
PUSH BC
EX DE,HL
RL (HL)
EX DE,HL
LD A,0
JR NC,L3
LD A,34
LD B, 4
LD (HL),A
INC HL
DJNZ L4
POP BC
DJNZ L2
EX DE,HL
POP |
HL |
PUSH |
HL |
LD |
B, 64 |
LD |
A, (HL) |
LD |
(DE),A |
INC |
HL |
INC |
DE |
DJNZ |
L5 |
POP |
HL |
LD |
DE, 96 |
ADD |
HL, DE |
POP |
DE |
INC |
DE |
POP |
BC |
DJNZ |
L1 |
RET |
|
DEFS |
8 |
BUF