Код:
org 32768
strt call FILL_TABLE
ld b,80
right push bc
ld ix,LINE_TABLE
ld b,24
nxt_ln push bc
call PRINT_NEXT_SPRITE
pop bc
ld de,lt_size
add ix,de
djnz nxt_ln
call SCROLL
pop bc
djnz right
jr strt
;---------------------------------
;заполнение экранных адресов
FILL_TABLE
ld ix,LINE_TABLE
ld b,0
nxt_line
push bc
ld de,LEVEL
call ADDR_AFTER255
pop bc
ld (IX+line_ptr),e
ld (IX+line_ptr+1),d
push bc
call NEXT_LINE_PTR
pop bc
call SCR_ADDR
ld (IX+print_addr),l
ld (IX+print_addr+1),h
ld (IX+attr_addr),e
ld (IX+attr_addr+1),d
ld de,lt_size
add ix,de
inc b
ld a,24
cp b
jr nz,nxt_line
ret
;---------------------------------
;Печать спрайта из ленты
PRINT_NEXT_SPRITE
ld l,(IX+ribbon_ptr)
ld h,(IX+ribbon_ptr+1)
nxt_rib
ld a,(hl) ;номер спрайта
cp 255 ;конец ленты?
jr nz,no_endrib
;конец
dec (IX+ribbon_cnt)
call z,NEXT_LINE_PTR ;счётчик обнулился, следующая лента
ld l,(IX+ribbon_start)
ld h,(IX+ribbon_start+1)
ld (IX+ribbon_ptr),l
ld (IX+ribbon_ptr+1),h
jr nxt_rib
no_endrib
;в A номер спрайта
ld l,a
ld h,0
push hl
ld de,spr_attribs
add hl,de
ld a,(hl)
ld l,(IX+attr_addr)
ld h,(IX+attr_addr+1)
ld (hl),a
pop hl
add hl,hl
add hl,hl
add hl,hl ;x8
ld de,sprites
add hl,de ;адрес спрайта
ld e,(IX+print_addr)
ld d,(IX+print_addr+1)
ld b,8
nxt_b ld a,(hl)
ld (de),a
inc hl
inc d
djnz nxt_b
ld l,(IX+ribbon_ptr)
ld h,(IX+ribbon_ptr+1)
inc hl
ld (IX+ribbon_ptr),l
ld (IX+ribbon_ptr+1),h
ret
;---------------------------------
;Заполнение данных ленты из указателя линии уровня и его сдвиг
NEXT_LINE_PTR
ld l,(IX+line_ptr)
ld h,(IX+line_ptr+1)
ld b,(hl)
ld de,RIBBONS
call ADDR_AFTER255
ld (IX+ribbon_ptr),e
ld (IX+ribbon_ptr+1),d
ld (IX+ribbon_start),e
ld (IX+ribbon_start+1),d
inc hl
ld a,(hl)
ld (IX+ribbon_cnt),a
inc hl
ld (IX+line_ptr),l
ld (IX+line_ptr+1),h
ret
;---------------------------------
;адрес после разделителя 255 по номеру b
ADDR_AFTER255
xor a
cp b
ret z
nxt_de ld a,(de)
inc de
cp 255
jr nz,nxt_de
djnz nxt_de
ret
;---------------------------------
;сдвиг экрана
SCROLL
ld de,16384
ld hl,16385
ld bc,6911
ldir
ret
;---------------------------------
SCR_ADDR
;адрес 31ого знакоместа линии
ld a,b
and %00011000
or %01000000 ;+16384
ld h,a
ld a,b
rrca
rrca
rrca
ld d,a ;для расчёта атрибутов
or %00011111 ;+31
ld l,a
;адрес атрибутов этого знакоместа
ld e,l ;уже частично посчитано
ld a,d
and %00000011
or %01011000 ;+22528
ld d,a
ret
LINE_TABLE DEFS 288,0
line_ptr equ 0 ;2 - указывает на текущую свёртку в линии уровня
ribbon_ptr equ 2 ;2 - адрес текущего номера спрайта в ленте
ribbon_start equ 4 ;2 - начальный адрес текущей ленты
print_addr equ 6 ;2 - адрес знакоместа
attr_addr equ 8 ;2 - адрес атрибутов
ribbon_cnt equ 10 ;1 - счётчик количества повторяющихся лент
lt_size equ 11 ;количество байт в данных линии
LEVEL
DEFB 0,20,255
DEFB 3,20,255
DEFB 3,12,0,8,255
DEFB 3,20,255
DEFB 0,12,3,8,255
DEFB 3,20,255
DEFB 3,20,255
DEFB 3,4,1,1,3,15,255
DEFB 3,4,2,1,3,15,255
DEFB 3,20,255
DEFB 3,20,255
DEFB 3,20,255
DEFB 3,20,255
DEFB 3,20,255
DEFB 3,12,1,1,3,1,0,6,255
DEFB 3,12,2,1,3,2,0,5,255
DEFB 3,20,255
DEFB 3,20,255
DEFB 3,6,1,1,3,1,1,1,3,11,255
DEFB 3,6,2,1,3,1,2,1,3,11,255
DEFB 3,20,255
DEFB 3,20,255
DEFB 3,20,255
DEFB 0,20,255
RIBBONS
DEFB 1,1,1,1,255
DEFB 2,3,4,5,255
DEFB 6,7,8,9,255
DEFB 0,0,0,0,255
SPRITES
DEFB 0,0,0,0,0,0,0,0
DEFB 255,2,2,2,255,32,32,32
DEFB 0,0,0,0,28,62,127,111
DEFB 0,0,0,56,125,251,127,238
DEFB 0,0,0,248,253,254,127,255
DEFB 0,0,0,240,248,252,220,184
DEFB 93,42,20,0,0,0,0,0
DEFB 85,170,81,0,0,0,0,0
DEFB 125,186,84,168,0,0,0,0
DEFB 84,168,80,0,0,0,0,0
SPR_ATTRIBS
DEFB 8,16,15,15,15,15,15,15,15,15
print_bc
CALL 11563
CALL 11747
jr $