Код:
; тестовая программа
ORG 60000
LD HL,SPRITE
LD D,0
LD E,0
CALL ZOOM
RET
; подпрограмма масштабирования в 4 раза спрайта
; входные параметры: HL=адрес спрайта, DE=координаты знакоместа для вывода на экране (D-вертик., E-гориз.)
ZOOM LD A,(HL) ; HL = адрес нахождения в спрайте
AND A
RET Z ; выход, если пустой спрайт
LD B,A
ZOOML1 PUSH BC ; B = количество знакомест в спрайте
PUSH DE ; DE = координаты знакоместа для вывода
INC HL
LD A,(HL)
RLCA
RLCA
ADD A,D
LD B,A
INC HL
LD A,(HL)
RLCA
RLCA
ADD A,E
LD C,A ; BC = реальные координаты левого верхнего знакоместа на экране
INC HL
EX DE,HL ; DE = адрес нахождения в спрайте, HL = свободно
LD (TMP_BC),BC ; запоминаем BC
LD A,B ; расчет адреса атрибутов знакоместа в HL
RRCA
RRCA
RRCA
LD L,A
AND 31
OR 88
LD H,A
LD A,L
AND 252
OR C
LD L,A ; HL = адрес атрибутов левого верхнего знакоместа
; заполняем квадрат 4х4 знакоместа змейкой байтом атрибутов
LD BC,32
LD A,(DE) ; читаем байт атрибутов знакоместа в спрайте
LD (HL),A ; заносим атрибуты знакоместа на экран
INC HL
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
ADD HL,BC
LD (HL),A
DEC HL
LD (HL),A
DEC HL
LD (HL),A
DEC HL
LD (HL),A
ADD HL,BC
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
ADD HL,BC
LD (HL),A
DEC HL
LD (HL),A
DEC HL
LD (HL),A
DEC HL
LD (HL),A
; масштабируем по паре байтов знакоместа (4 пары), заполняем прямоугольник 4х1 знакоместа
LD B,4
ZOOML2 PUSH BC ; B = номер пары байтов изображения
LD BC,(TMP_BC) ; BC = реальные координаты левого верхнего знакоместа для пары
INC B
LD (TMP_BC),BC ; сразу запоминаем BC для следующей пары байтов
DEC B
INC DE ; DE = адрес нахождения в спрайте
LD A,B ; расчет адреса первого байта знакоместа в HL
LD H,A
RRCA
RRCA
RRCA
AND A,224
ADD A,C
LD L,A
LD A,H
AND 24
OR 64
LD H,A ; HL = адрес вывода знакоместа на экране, DE = адрес изображения в спрайте
PUSH DE
CALL ZBYTES ; выводим масштабированный первый байт пары
POP DE
INC DE
PUSH DE
INC H ; следующая строка в знакоместе
CALL ZBYTES ; выводим масштабированный второй байт пары
POP DE
POP BC
DJNZ ZOOML2 ; на следующую пару
EX DE,HL ; HL = адрес нахождения в спрайте, DE = свободно
POP DE ; DE = координаты спрайта на экране
POP BC ; B = цикл по количеству знакомест в спрайте
DJNZ ZOOML1
RET
; масштабирование байта изображения
; DE = адрес в спрайте, HL = адрес первого байта знакоместа на экране
ZBYTES LD A,(DE)
LD B,A ; B = байт изображения
XOR A
LD C,A
LD D,A
LD E,A ; в регистры C,D,E,A будем кидать масштабированные по горизонтали биты по два
ZOOM7 RL B ; загоняем во флаг CY 7-й бит байта изображения
JP NC,ZOOM6 ; если CY=0, переходим на следующий
OR #F0 ; устанавливаем %1111 для бита
ZOOM6 RL B
JP NC,ZOOM5
OR #0F
ZOOM5 LD C,A
XOR A
RL B
JP NC,ZOOM4
OR #F0
ZOOM4 RL B
JP NC,ZOOM3
OR #0F
ZOOM3 LD D,A
XOR A
RL B
JP NC,ZOOM2
OR #F0
ZOOM2 RL B
JP NC,ZOOM1
OR #0F
ZOOM1 LD E,A
XOR A
RL B
JP NC,ZOOM0
OR #F0
ZOOM0 RL B
JP NC,ZOOM8
OR #0F
; выводим на экран содержимое регистров C,D,E,A змейкой в прямоугольник 4х0.5 знакоместа
ZOOM8 LD (HL),C
INC HL
LD (HL),D
INC HL
LD (HL),E
INC HL
LD (HL),A
INC H
LD (HL),A
DEC HL
LD (HL),E
DEC HL
LD (HL),D
DEC HL
LD (HL),C
INC H
LD (HL),C
INC HL
LD (HL),D
INC HL
LD (HL),E
INC HL
LD (HL),A
INC H
LD (HL),A
DEC HL
LD (HL),E
DEC HL
LD (HL),D
DEC HL
LD (HL),C
RET
TMP_BC DEFW 0 ; буфер для хранения значений в BC
SPRITE ; тестовый спрайт
DEFB 16
DEFB 0,0,33, 128,0,0,24,24,0,8,255
DEFB 1,0,34, 192,48,192,48,192,48,192,48
DEFB 1,1,33, 12,3,12,3,12,3,12,3
DEFB 1,2,33, 0,0,0,0,128,192,64,192
DEFB 2,0,2, 254,159,129,224,254,31,24,248
DEFB 2,1,2, 7,230,254,223,193,240,255,15
DEFB 2,2,2, 192,64,64,192,192,64,64,192
DEFB 3,0,2, 255,159,128,224,255,31,24,248
DEFB 3,1,2, 6,254,255,195,192,254,63,6
DEFB 3,2,2, 64,64,192,192,64,64,192,192
DEFB 4,0,3, 255,143,128,224,255,31,24,248
DEFB 4,1,3, 230,255,207,192,248,255,6,6
DEFB 4,2,3, 64,192,192,64,64,192,192,64
DEFB 5,0,3, 255,131,128,224,255,24,24,248
DEFB 5,1,3, 255,255,192,192,255,31,6,6
DEFB 5,2,3, 192,192,64,64,192,192,64,64