|
Miracle
#03
16 июля 1999 |
|
Кто там кодит? - Fast 42 print: быстрая процедура печати 42 символов в строке.

(c) Death Moroz
----------------
Быстрая процедура печати
42 символов в строке
Хотел бы поделиться некоторыми свои-
ми изысканиями в области вывода 42-х
символов в строке, вся суть которого
состоит в том, что в памяти создается 3
дополнительных фонта, процедуры для их
создания примерно следующие:
FONT EQU ADRES ;АДРЕС БАЗОВОГО ФОНТА
FONT2 EQU 49152
FONT3 EQU FONT2+4096
FONT4 EQU FONT3+4096 ;АДРЕСА БУДУЩИХ ФОНТОВ
;ИХ РАЗМЕРЫ БУДУТ В 2
;РАЗА БОЛЬШЕ ИСХОДНОГО
;ПРОЦЕДУРА СОЗДАНИЯ ФОНТА СО СМЕЩЕНИЕМ 6
;БИТ ОТ НАЧАЛА ЗНАКОМЕСТА:
LD DE,FONT2
LD HL,FONT
LD BC,2048
F_CR1 LD A,(HL)
RLCA
RLCA
PUSH AF
AND 3
LD (DE),A
INC DE
POP AF
АND 252
LD (DE),A
INC DE
INC HL
DEC BC
LD A,B
OR C
JR NZ,F_CR1
;ПРОЦЕДУРА СОЗДАНИЯ ФОНТА СО СМЕЩЕНИЕМ 4
;БИТA ОТ НАЧАЛА ЗНАКОМЕСТА:
LD DE,FONT3
LD HL,FONT
LD BC,2048
F_CR2 LD A,(HL)
RRCA
RRCA
RRCA
RRCA
PUSH AF
AND 15
LD (DE),A
INC DE
POP AF
АND 240
LD (DE),A
INC DE
INC HL
DEC BC
LD A,B
OR C
JR NZ,F_CR2
;ПРОЦЕДУРА СОЗДАНИЯ ФОНТА СО СМЕЩЕНИЕМ 6
;БИТ ОТ НАЧАЛА ЗНАКОМЕСТА:
LD DE,FONT4
LD HL,FONT
LD BC,2048
F_CR3 LD A,(HL)
RRCA
RRCA
PUSH AF
AND 63
LD (DE),A
INC DE
POP AF
АND 192
LD (DE),A
INC DE
INC HL
DEC BC
LD A,B
OR C
JR NZ,F_CR3
Далее пример вывода строки фонтами,
созданными таким способом. На входе в HL
адрес текста, экран должен быть очищен.
LD (SP_+1),SP
BEGIN LD A,(HL)
CP #0D ;ПРИЗНАК КОНЦА СТРОКИ
JP Z,SP_
INC HL
EXX
EX AF,AF'
S_ADR LD DE,#4000 ;КУДА ВЫВОДИТЬ
BITS LD A,0 ;СМЕЩЕНИЕ ОТ НАЧАЛА ЗНАКОМЕСТА
OR A
JR Z,BIT0
CP 6
JR Z,BIT6
CP 4
JR Z,BIT4
XOR A
LD BC,FONT4
JR S_OUT
BIT4 LD A,2
LD BC,FONT3
JR S_OUT
BIT6 LD BC,FONT2
LD A,4
S_OUT LD(BITS+1),A
EX AF,AF'
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,BC
LD SP,HL
EX DE,HL
;───────────────┐
POP BC; │
LD A,C; │
OR (HL); │
LD (HL),A;│ ПОВТОРИТЬ
INC L; │ 4
LD (HL),B;│ РАЗА
INC H; │
POP BC; │
LD (HL),B;│
DEC L; │
LD A,C; │
OR (HL); │
LD (HL),A;│
INC H; │
;───────────────┘
LD A,(S_ADR+1)
INC A
LD (S_ADR+1),A
EXX
JR BEGIN
BIT0 EX AF,AF'
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,FONT
ADD HL,BC
LD SP,HL
EX DE,HL
;───────────────┐
POP BC; │
LD (HL),C;│ ПОВТОРИТЬ
INC H; │ 4
LD (HL),B;│ РАЗА
INC H; │
;───────────────┘
LD A,6
LD (BITS+1),A
EXX
JP BEGIN
SP_ LD SP,0
RET
На последок дам примерчик процедурки
установки атрибутов в 42-х символьной
строке (без единого pop/push'a;)).:
LD BC,TEXT_ADR
LD DE,#5800 ;АДРЕС В АТРИБУТАХ
LD A,68 ;ЦВЕТ ПО УМОЛЧАНИЮ
LD (COLOR+1),A
A_S0 LD HL,A_TABL
A_S1 LD A,(BC)
INC BC
CP 32
JR NC,A_K
CP 3 ;КОД КОНЦА ТЕКСТА
RET Z
CP #0D ;КОД КОНЦА СТРОКИ
JR Z,A_N
CP #10 ;КОД СМЕНЫ АТРИБУТА
JR Z,A_C
;
A_K LD A,E
EX AF,AF'
LD A,E
ADD A,(HL)
LD E,A
COLOR LD A,0
LD (DE),A
EX AF,AF'
LD E,A
INC HL
JR A_S1
A_C LD A,(BC)
LD (COLOR+1),A
INC BC
JR A_S1
A_N LD A,E
EX AF,AF'
LD A,E
ADD A,(HL)
LD E,A
LD A,(COLOR+1)
LD (DE),A
EX AF,AF'
LD E,A
LD HL,32
ADD HL,DE
EX DE,HL
LD A,D
CP #5B
JR C,A_S0
RET
A_TAB DB 0,0,1,2,3,3,4,5,6,6,7,8,9,9,10,11
DB 12,12,13,14,15,15,16,17,18,18,19
DB 20,21,21,22,23,24,24,25,26,27,27
DB 28,29,30,30,31,31
Пользуясь случаем, хотелось бы выра-
зить свое мнение по поводу "ассемблеров,
которые мы выбираем": лично для меня
крутизна ассемблера определяется не
скоростью компиляции, не наличием кучи
всяких сетапов и оверлеев в виде минера
& Co, а скоростью и удобством редактора,
коим, на мой взгляд, является XAS, ведь
только в можно набрать:
(hl) .40
и получить:
ld (hl),#40
Всеми хваленый alasm завалил бы вас
кучей вопросов, а новоявленный storm
обладает таким мизерным объемом свобод-
ной памяти, что весь его фреймовый
скроллинг сводится на нет (хорошо,что
хоть нет мультиколорного скрин-савера;))
Для XAS'а же достаточно не портить 1
банк...
А об макросах, многооконности,
пометках строк для быстрого перехода и
прочего я вообще "молчу". Короче, кто им
пользуется, меня поймет. Всем несоглас-
ным просьба обращаться в редакцию жур-
нала...%)
Другие статьи номера:
Похожие статьи:
В этот день... 18 ноября