Код:
BaseScrAddr equ #c000 ;адрес экрана
RightCol equ #4d ;последний столбик справа
MapLeftPart dw 0 ;число столбцов в левой части экрана для карты
MapRightPart dw 0 ;число столбцов в правой части экрана для карты
PrintMapPag db 0 ;страница памяти с которой начинается карта
PrintMapCol dw 0 ;номер текущего столбика для печати
PrintMapCol2 dw 0 ;количество столбцов для переноса справа
PrintMapAddr dw 0 ;текущий адрес карты
MapPrintTable equ #4000 ;таблица адресов команд копирования 1-78 байт
MapPrintCode equ #4100 ;наборы команд ldi от 1 до 78 подряд, и ret в конце, формируется автоматически при старте, занимает 6240 байт
;печать готовой карты из памяти
MapPrint
ld a,(PrintMapPag) ;включим нужную страницу
call PageSlot2G
ld hl,(PrintMapAddr)
ld bc,(PrintMapCol) ;сколько байт переносить левая часть
; inc c
ld de,BaseScrAddr
ld a,80
sub c
cp 80
jr nc,MapPrint3 ;пропустим если левую часть не надо рисовать
ld (MapRightPart),a
ld a,20*8 ;высота для переноса
MapPrint1
;ldir
push hl ;
ld hl,MapPrintTable-2
add hl,bc
add hl,bc ;теперь известен адрес ссылки на цепочку ldi
ld c,(hl)
inc hl
ld b,(hl)
push bc ;сохраним адрес цепочки
pop ix
pop hl
ld bc,MapPrint11 ;адрес возврата
push bc
jp (ix) ;переход на адрес
MapPrint11
ex de,hl ;пропустим правую часть
ld bc,(MapRightPart)
add hl,bc
ex de,hl
add hl,bc
ld bc,(PrintMapCol)
dec a
jr nz,MapPrint1
MapPrint3
;теперь печать правой части из следующей страницы
ld a,(PrintMapCol)
cp RightCol+1
jr z,MapPrintE ;пропустить если не надо
ld a,(PrintMapPag) ;включим нужную страницу
inc a
call PageSlot2G
ld hl,(PrintMapAddr)
ld de,BaseScrAddr
ld bc,(PrintMapCol)
ld e,c
ld b,0 ;сколько байт переносить правая часть
;ld c,l
ld a,80
sub c
sub 2 ;минус два последних столбика не рисуются
ld c,a
ld (PrintMapCol2),bc
ld a,80
sub l
ld (MapLeftPart),a
ld l,0 ;правая часть карты должна копироваться с начала
ld a,20*8 ;высота для переноса
MapPrint2
;ldir
push hl ;
ld hl,MapPrintTable-2
add hl,bc
add hl,bc ;теперь известен адрес ссылки на цепочку ldi
ld c,(hl)
inc hl
ld b,(hl)
push bc ;сохраним адрес цепочки
pop ix
pop hl
ld bc,MapPrint22 ;адрес возврата
push bc
jp (ix) ;переход на адрес
MapPrint22
ex de,hl ;пропустим левую часть
ld bc,(MapLeftPart)
add hl,bc
ex de,hl
add hl,bc
ld bc,(PrintMapCol2)
dec a
jr nz,MapPrint2
MapPrintE
ret
MapCopyMake ;формирует код быстрого переброса карты, т.е. цепочек ldi
ld ix,MapPrintTable ;таблица переходов
ld hl,MapPrintCode ;формируемый код
ld a,78 ;всего строк
ld c,1 ;начнём с одной ldi
MapCopyMake2
ld b,c
ld (ix),l ;запомнить адрес перехода
inc ix
ld (ix),h
inc ix
MapCopyMake1
ld (hl),#ed
inc hl
ld (hl),#a0 ;код ldi
inc hl
djnz MapCopyMake1
ld (hl),#c9 ;код ret
inc hl
inc c
dec a
jr nz,MapCopyMake2
ret
MapCopyMakeEnd
org #6ac0
do_scroll_new
;рассчёты для отрисовки готовой карты из памяти
;сначала адрес вывода на экран
ld hl,(PrintMapAddr)
inc hl
ld a,l
cp RightCol+1 ;не дошло до края экрана?
jr c,do_scroll_new1
ld l,0
do_scroll_new1
ld (PrintMapAddr),hl
;теперь столбик склейки двух частей левой и правой
ld a,(PrintMapCol)
dec a
jr c,do_scroll_new2
;пора на след.страницу памяти
ld hl,PrintMapPag
inc (hl)
ld a,RightCol+1
do_scroll_new2
ld (PrintMapCol),a
ret
do_scroll_newEnd