Код:
; тестовая программа
ORG 60000
LD HL,SPRITE
LD D,0
LD E,0
CALL ZOOM
RET
; подпрограмма масштабирования в 2 раза и вывода спрайта
; входные параметры: 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
ADD A,D
LD B,A
INC HL
LD A,(HL)
RLCA
ADD A,E
LD C,A ; BC = реальные координаты левого верхнего знакоместа на экране
INC HL
EX DE,HL ; DE = адрес нахождения в спрайте, HL = свободно
LD A,B ; расчет адреса первого байта знакоместа в HL для 1-4 байтов изображения
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 BC
CALL ZBYTES ; выводим масштабированный первый байт
INC DE ; следующий байт изображения в спрайте
INC H ; следующая строка в знакоместе
CALL ZBYTES ; выводим масштабированный байт
INC DE ; следующий байт изображения в спрайте
INC H ; следующая строка в знакоместе
CALL ZBYTES ; выводим масштабированный байт
INC DE ; следующий байт изображения в спрайте
INC H ; следующая строка в знакоместе
CALL ZBYTES ; выводим масштабированный байт
POP BC
INC B ; второе знакоместо ниже для 5-8 байтов изображения
LD A,B ; расчет адреса первого байта знакоместа в HL для 5-8 байтов изображения
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 = адрес изображения в спрайте
INC DE ; следующий байт изображения в спрайте
CALL ZBYTES ; выводим масштабированный байт
INC DE ; следующий байт изображения в спрайте
INC H ; следующая строка в знакоместе
CALL ZBYTES ; выводим масштабированный байт
INC DE ; следующий байт изображения в спрайте
INC H ; следующая строка в знакоместе
CALL ZBYTES ; выводим масштабированный байт
INC DE ; следующий байт изображения в спрайте
INC H ; следующая строка в знакоместе
CALL ZBYTES ; выводим масштабированный байт
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 ; в регистры C и A будем кидать масштабированные по горизонтали биты по четыре
ZOOM7 RL B ; загоняем во флаг CY 7-й бит байта изображения
JP NC,ZOOM6 ; если CY=0, переходим на следующий
OR %11000000 ; устанавливаем %11 для бита
ZOOM6 RL B
JP NC,ZOOM5
OR %00110000
ZOOM5 RL B
JP NC,ZOOM4
OR %00001100
ZOOM4 RL B
JP NC,ZOOM3
OR %00000011
ZOOM3 LD C,A
XOR A
RL B
JP NC,ZOOM2
OR %11000000
ZOOM2 RL B
JP NC,ZOOM1
OR %00110000
ZOOM1 RL B
JP NC,ZOOM0
OR %00001100
ZOOM0 RL B
JP NC,ZOOM8
OR %00000011
; выводим на экран содержимое регистров C и A змейкой в 2 байта по 2 строки
ZOOM8 LD (HL),C
INC HL
LD (HL),A
INC H
LD (HL),A
DEC HL
LD (HL),C
RET
SPRITE ; тестовый спрайт
DEFB 16
DEFB 0,0, 255,0,0,24,24,0,0,255
DEFB 1,0, 192,48,192,48,192,48,192,48
DEFB 1,1, 12,3,12,3,12,3,12,3
DEFB 1,2, 0,0,0,0,128,192,64,192
DEFB 2,0, 254,159,129,224,254,31,24,248
DEFB 2,1, 7,230,254,223,193,240,255,15
DEFB 2,2, 192,64,64,192,192,64,64,192
DEFB 3,0, 255,159,128,224,255,31,24,248
DEFB 3,1, 6,254,255,195,192,254,63,6
DEFB 3,2, 64,64,192,192,64,64,192,192
DEFB 4,0, 255,143,128,224,255,31,24,248
DEFB 4,1, 230,255,207,192,248,255,6,6
DEFB 4,2, 64,192,192,64,64,192,192,64
DEFB 5,0, 255,131,128,224,255,24,24,248
DEFB 5,1, 255,255,192,192,255,31,6,6
DEFB 5,2, 192,192,64,64,192,192,64,64