;tilemask содержит адреса процедур для каждой клетки:
;copychr или skipchr
;cl=screen addr
;bl=attr addr
;в стеке лежат значения VALID0,VALID1, из которых образуются адреса процедур
;в конце строки лежит validnext (2 байта)
valid00
;inc l
;inc l
ret
valid00_size=$-valid00
valid10
ld l,-2
add hl,sp
ld h,b
ld e,l
ld d,hx
dup 7
ld a,(hl)
ld (de),a
inc h
inc d
edup
ld a,(hl)
ld (de),a
ld h,c
ld d,lx
ld a,(hl)
ld (de),a
inc l
inc l
ret
valid10_size=$-valid10
valid01
ld l,-1
add hl,sp
;inc l
ld h,b
ld e,l
ld d,hx
dup 7
ld a,(hl)
ld (de),a
inc h
inc d
edup
ld a,(hl)
ld (de),a
ld h,c
ld d,lx
ld a,(hl)
ld (de),a
inc l
ret
valid01_size=$-valid10
valid11
ld l,-2
add hl,sp
if 1==1 ;381t, 62b
ld e,l
ld d,lx
ld h,c
;ld a,d
;add a,+(0x40-(scrbuf/256))&0xff
;ld h,a
ldi ;attr(left)
ld a,(hl)
ld (de),a ;attr(right)
ld h,b
ld d,hx
dup 3
ldd
ld a,(hl)
ld (de),a
inc h
inc d
ldi
ld a,(hl)
ld (de),a
inc h
inc d
edup
ldd
ld a,(hl)
ld (de),a
inc h
inc d
ldi
ldi
ld a,c
add a,10
ld c,a
ret
else ;426t, 78b
ld e,l
ld d,hx
ld h,b
dup 7
ld a,(hl)
ld (de),a
inc h
inc d
edup
ld a,(hl)
ld (de),a ;scr(left)
ld h,c
ld d,lx
ld a,(hl)
ld (de),a ;attr(left)
inc l
inc e
ld a,(hl)
ld (de),a ;attr(right)
ld h,b
ld d,hx
dup 7
ld a,(hl)
ld (de),a
inc h
inc d
edup
ld a,(hl)
ld (de),a ;scr(right)
inc l
ret
endif
valid11_size=$-valid11
prvalid
ld (prvalidsp),sp
ld sp,validmap
;ld l,0 ;начало экрана
ld bc,scrbuf/256*256+(scrbuf/256+0x18)
ld ix,0x4058 ;scr,attr
ret
clearvalid
ld (prvalidsp),sp
ld sp,validmap+(validmaplinesize*tilemaphgt)
validq
ld hl,validq
ld de,VALID00
ld b,tilemaphgt
clearvalid0
push hl ;validq или validnext
dup validmaplinesize/2-1
push de
edup
ld hl,validnext
djnz clearvalid0
prvalidsp=$+1
ld sp,0
ret
validnext
ld l,-1
add hl,sp
;inc l
inc l
ret nz
ld a,b
add a,8
ld b,a
add a,+(0x40-(scrbuf/256))&0xff
ld hx,a
inc c
ld a,c
add a,+(0x40-(scrbuf/256))&0xff
ld lx,a
ret
prlives
;печатаем lives сердечек и далее один пробел
ld de,0x401f;scrbuf+0x1f
ld a,(lives)
inc a
ld c,a
prlives0
push de
ld a,c
dec a
ld hl,sprlife
jr nz,$+5
ld hl,sprnolife
ld b,8
prlives1
ld a,(hl)
ld (de),a
inc hl
inc d
djnz prlives1
pop de
call nextlinede
dec c
jr nz,prlives0
ret
sprnolife
ds 8
sprlife
db %00000000
db %00110110
db %01111111
db %01111111
db %00111110
db %00011100
db %00001000
db %00000000
nextlinede
ld a,e
add a,32
ld e,a
ret nc
ld a,d
add a,8
ld d,a
ret
prmap
ld hl,tilemap
ld de,scrbuf
ld hx,d
ld lx,scrbuf/256+0x18
exx
ld c,tilemaphgt
prmaplines
exx
push de
exx
ld b,tilemapwid
prmapline
exx
ld c,(hl)
inc hl
ld b,tilepic/256
ld d,hx
dup 7
ld a,(bc)
ld (de),a
inc c
inc d
edup
ld a,(bc)
ld (de),a
inc c
ld d,lx
ld a,(bc)
ld (de),a
inc e
exx
djnz prmapline
exx
ld de,tilemaplinesize-tilemapwid
add hl,de
pop de
ld a,e
add a,32
ld e,a
jr nc,prmapnewlineq
ld a,hx
add a,8
ld hx,a
inc lx
prmapnewlineq
exx
dec c
jr nz,prmaplines
;сделать невалидными выведенные ячейки
ld hl,validmap
ld a,tilemaphgt
prmap_invalidatelines
ld bc,tilemapwid-1
ld d,h
ld e,l
inc de
ld (hl),VALID1
ldir
ld bc,validmaplinesize-(tilemapwid-1)
add hl,bc
dec a
jr nz,prmap_invalidatelines
ret
probjlist
ld ix,objlist
ld b,0
probjlist0
ld a,(ix+(obj_x+1))
cp TERMINATOR
ret z
ld l,(ix+obj_objaddr)
ld h,(ix+(obj_objaddr+1))
;hl=адрес описателя объекта (в начале лежит указатель на список анимаций)
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
;hl=указатель на список анимаций
ld c,(ix+obj_anim) ;номер анимации
;ld b,0
add hl,bc
add hl,bc
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
;hl=указатель на анимацию
ld c,(ix+obj_animphase) ;номер фазы анимации
;ld b,0
add hl,bc
add hl,bc
add hl,bc
inc hl ;пропустили время фазы
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
;hl=адрес views для данной фазы анимации
ld c,(ix+obj_dir) ;номер направления 0..3
;ld b,0
add hl,bc
add hl,bc
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
;hl=адрес спрайта
exx
ld c,(ix+obj_x)
ld a,(ix+(obj_x+1))
if coordsfactor !=4
display "coordsfactor!=4"
endif
rra
rr c
rra
rr c
ld b,(ix+obj_y)
ld a,(ix+(obj_y+1))
if coordsfactor !=4
display "coordsfactor!=4"
endif
rra
rr b
rra
rr b
writereobjaddr=$+1
ld hl,reobjlist
ld (hl),c
inc hl
ld (hl),b
inc hl
ld (writereobjaddr),hl
;сделать невалидными выведенные ячейки
;ld (validxy),bc
CALCvalidmapaddr_bcyx_tohl
ld a,VALID1
ld de,validmaplinesize-2
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
add hl,de
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
add hl,de
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
call prspr ;на выходе b=0
if 1==0
;сделать невалидными выведенные ячейки
validxy=$+1
ld hl,0
CALCvalidmapaddr_hlyx_tohl
ld a,VALID1
ld c,validmaplinesize-2
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
add hl,bc
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
add hl,bc
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
endif
ld c,objsize
add ix,bc
jp probjlist0
prbulletlist
ld ix,bulletlist
ld de,objsize
prbulletlist0
ld a,(ix+(obj_x+1))
cp TERMINATOR
ret z
ld c,(ix+obj_x)
ld a,(ix+(obj_x+1))
if coordsfactor !=4
display "coordsfactor!=4"
endif
rra
rr c
rra
rr c
ld b,(ix+obj_y)
ld a,(ix+(obj_y+1))
if coordsfactor !=4
display "coordsfactor!=4"
endif
rra
rr b
rra
rr b
writerebulletaddr=$+1
ld hl,rebulletlist
ld (hl),c
inc hl
ld (hl),b
inc hl
ld (writerebulletaddr),hl
CALCvalidmapaddr_bcyx_tohl
ld (hl),VALID1
COORDSBC_TOSCRHL
;hl=screen addr
ld a,c
and 7 ;a=shift right 0..7
inc a
ld b,a ;b=shift right 1..8
ld a,0x01
rrca
djnz $-1
or (hl)
ld (hl),a
;ld de,objsize
add ix,de
jp prbulletlist0
cls
ld hl,0x4000
call clshl
;красим жизни
ld de,0x581f;scrbuf+0x1800+0x1f
ld b,maxlives
clscrbuf0
ld a,0x42 ;bright red
ld (de),a
ld a,e
add a,32
ld e,a
djnz clscrbuf0
ret
clshl
ld d,h
ld e,l
inc de
ld bc,0x1800
ld (hl),0;0xff
ldir
ld (hl),emptyattr
ld bc,767
ldir
ret
clscrbuf
ld hl,scrbuf
call clshl
ret
displaycollisionmap
ld hl,collisionmap
ld de,0x5800
ld b,collisionmaphgt
displaycollisionmap0
push bc
ld b,collisionmapwid
displaycollisionmap1
ld a,(hl)
inc hl
add a,7
or 7
ld (de),a
inc de
djnz displaycollisionmap1
ld bc,collisionmaplinesize-collisionmapwid
add hl,bc
ex de,hl
ld bc,32-collisionmapwid
add hl,bc
ex de,hl
pop bc
djnz displaycollisionmap0
ret
restoreobjects
ld hl,(writereobjaddr)
ld de,reobjlist
or a
sbc hl,de
jp z,restoreobjects_clear
ex de,hl
srl d
rr e
ld hx,e
restoreobjects0
ld c,(hl) ;x
inc hl
ld a,(hl) ;y
and 0xf8
ld b,a ;округлить!
inc hl
push hl
COORDSBC_TOSCRDE ;de=scrbuf+
ld a,b
rra
rra
rra
and 0x1f
ld l,a ;y (в знакоместах)
ld a,c
rra
rra
rra
and 0x1f ;x (в знакоместах)
call calctilemapaddr_a_l ;hl=tilemapaddr
call restoretile
inc l ;tilemap
inc e ;scrbuf
call restoretile
inc l ;tilemap
inc e ;scrbuf
call restoretile
ld bc,tilemaplinesize-2
add hl,bc
ld a,e
add a,32-2
ld e,a
jr nc,$+6
ld a,d
add a,8
ld d,a
call restoretile
inc l ;tilemap
inc e ;scrbuf
call restoretile
inc l ;tilemap
inc e ;scrbuf
call restoretile
ld bc,tilemaplinesize-2
add hl,bc
ld a,e
add a,32-2
ld e,a
jr nc,$+6
ld a,d
add a,8
ld d,a
call restoretile
inc l ;tilemap
inc e ;scrbuf
call restoretile
inc l ;tilemap
inc e ;scrbuf
call restoretile
pop hl
dec hx
jp nz,restoreobjects0
restoreobjects_clear
ld hl,reobjlist
ld (writereobjaddr),hl
ret
restorebullets
ld hl,(writerebulletaddr)
ld de,rebulletlist
or a
sbc hl,de
jp z,restorebullets_clear
ex de,hl
srl d
rr e
ld hx,e
restorebullets0
ld c,(hl) ;x
inc hl
ld a,(hl) ;y
and 0xf8
ld b,a ;округлить!
inc hl
push hl
COORDSBC_TOSCRDE ;de=scrbuf+
ld a,b
rra
rra
rra
and 0x1f
ld l,a ;y (в знакоместах)
ld a,c
rra
rra
rra
and 0x1f ;x (в знакоместах)
call calctilemapaddr_a_l ;hl=tilemapaddr
call restoretile
pop hl
dec hx
jp nz,restorebullets0
restorebullets_clear
ld hl,rebulletlist
ld (writerebulletaddr),hl
ret
restoretile
;hl=tilemap+
;de=scrbuf+
push de ;scrbuf+
push hl ;tilemap+
ld l,(hl)
ld h,tilepic/256 ;hl=tile gfx
dup 7
ld a,(hl)
ld (de),a ;restore scr (y=+0..6)
inc l
inc d
edup
ld a,(hl)
ld (de),a ;restore scr (y=+7)
inc l
ld a,d ;'scrbuf+7, 'scrbuf+0xf, 'scrbuf+0x17
;sub scrbuf/256
rrca ;0x80+'scrbuf/2+3, 0x80+'scrbuf/2+7, 0x80+'scrbuf/2+0xb
rrca ;0xc0+'scrbuf/4+1, 0xc0+'scrbuf/4+3, 0xc0+'scrbuf/4+5
rrca ;0xe0+'scrbuf/8+0, 0xe0+'scrbuf/8+1, 0xe0+'scrbuf/8+2
;and 3
add a,scrbuf/256+0x18 - (0xe0+scrbuf/0x800)
ld d,a ;de=attraddr
ld a,(hl)
ld (de),a ;restore attr
pop hl ;tilemap+
ld a,h
add a,+(validmap-tilemap)/256
ld d,a
ld e,l
ld a,VALID1 ;невалиден, надо перерисовать
ld (de),a
pop de ;scrbuf+
ret
prnum
ld bc,10000
call prdig
ld bc,1000
call prdig
ld bc,100
call prdig
ld bc,10
call prdig
ld bc,1
prdig
ld a,'0'-1
prdig0
inc a
or a
sbc hl,bc
jr nc,prdig0
add hl,bc
;push hl
call prchar
;pop hl
ret
prcharin
ld l,a
ld h,0
add hl,hl
add hl,hl
add hl,hl
ld bc,font-256;0x3c00
add hl,bc
ld b,8
prchar0
ld a,(hl) ;font
ld (de),a ;scr
inc hl
inc d ;+256
djnz prchar0
ret
prchar
;a=code
;de=screen
push de
push hl
call prcharin
pop hl
pop de
inc e
ret
prtext
;bc=координаты
;hl=text
prtext0
ld a,(hl)
or a
ret z
call prcharxy
inc hl
inc c
jr prtext0
calcscrbufaddr
;de=scrbuf + (y&0x18)+((y*32)&0xff+x)
ld a,b ;y
and 0x18
add a,scrbuf/256
ld d,a
ld a,b ;y
add a,a ;*2
add a,a ;*4
add a,a ;*8
add a,a ;*16
add a,a ;*32
add a,c ;x
ld e,a
ret
calcscraddr
;de=0x4000 + (y&0x18)+((y*32)&0xff+x)
ld a,b ;y
and 0x18
add a,0x40
ld d,a
ld a,b ;y
add a,a ;*2
add a,a ;*4
add a,a ;*8
add a,a ;*16
add a,a ;*32
add a,c ;x
ld e,a
ret
calcattraddr
call calcscraddr
;call calcattraddr_fromscr
calcattraddr_fromscr
;de=0x5800 + (y&0x18)/8+((y*32)&0xff+x)
ld a,d
;sub 0x40
rra
rra
rra
and 3
add a,0x58
ld d,a ;de=attraddr
ret
prcharxy
;a=code
;bc=yx
push bc
push de
push hl
push af
call calcscraddr
pop af
push de
call prcharin
pop de
call calcattraddr_fromscr
curattr=$+1
ld a,0
ld (de),a
pop hl
pop de
pop bc
ret
include "sprite.asm"
include "sprset.ast"
align 256
include "tileset.ast"