;процедуры для рисования в карту, нижнего уровня (зависят от типа экрана)
Pr2CharsInMap
;a'=char1
;a=char2
;de'=map+
;push bc
;PUSH HL
exx
ex af,af' ;'
SUB 32
add a,a
add a,a
add a,a
LD h,FONT/256
LD L,A
jr nc,$+3
inc h
call PrCharInMappp2
ex af,af' ;'
SUB 32
add a,a
add a,a
add a,a
LD h,FONT/256
LD L,A
jr nc,$+3
inc h
call PrCharInMappp2
exx
;POP HL
;POP bc
RET
PrCharInMappp2
call PrCharInMappp
;call MapGoRight_de
PrCharInMappp
;hl=gfx
;de=map+
_left=0x47
_right=0xb8
push de
push hl
push iy
ld a,(iy)
SETPGC000
ld b,7;8
PrCharInMappp0
ld a,(de)
rlc (hl)
jr nc,$+4
PrCharInMap_leftcolor=$+1
xor _left
rlc (hl)
jr nc,$+4
PrCharInMap_rightcolor=$+1
xor _right
ld (de),a
inc l
dec d
bit 6,d
call z,MapNextPg_de
djnz PrCharInMappp0
pop iy
pop hl
pop de
jp MapGoRight_de
SetXYInMap
;b=y
;c=x/4
;hl=NAMES+ (по нему /(4*12) можно вычислить номер команды и найти цвет)
ld a,l
push bc
exx
sub NAMES&0xff
ld c,9*3 ;color3 (red)
sub 48
jr c,SetXYInMap_colorok
ld c,9*1+0xc0 ;color9 (yellow)
sub 48
jr c,SetXYInMap_colorok
ld c,9*2+0xc0 ;color10 (green)
sub 48
jr c,SetXYInMap_colorok
ld c,9*6+0xc0 ;color14 (cyan)
SetXYInMap_colorok
ld a,c
and 0x47
ld (PrCharInMap_leftcolor),a
xor c
ld (PrCharInMap_rightcolor),a
pop bc
ld a,b ;y
cpl
rlca
rlca
and 3 ;y/64
srl c ;x0=x phase (0/2)
adc a,a
add a,a
if SKIPPGS
add a,SKIPPGS
endif
ld ly,a;0
ld hy,tpushpgs/256 ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
ld a,b ;y
and 0x3f
cpl
ld d,a
;c=0: l=0x3d
;c=1: l=0x3e
;c=2: l=0x39
;c=3: l=0x3a
;...
ld a,c ;x/8
cpl
add a,a
and 0xfc
rr c
adc a,1
ld e,a
ld a,(iy)
SETPGC000
exx
ret
DrawWormInMap ;TODO и в маску?
;de=x in pixels
;l=y
;bc=gfx
push bc ;gfx
ld a,l ;y
cpl
rlca
rlca
and 3 ;y/64
add a,a
add a,a
srl d
rr e
jr c,DrawWormInMap_right
xor e
and 0xfc ;0..3 x layer
xor e
if SKIPPGS
add a,SKIPPGS
endif
ld ly,a;0
ld hy,tpushpgs/256 ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
srl d
rr e
srl d
rr e
ld a,l ;y
and 0x3f
cpl
;add a,0xc0
ld d,a
;e=0: l=0x3d
;e=1: l=0x3e
;e=2: l=0x39
;e=3: l=0x3a
;...
ld a,e ;x/8
cpl
add a,a
and 0xfc
;inc a ;add a,1;l
rr e
adc a,1
ld e,a
pop hl ;gfx
call DrawWormInMappp2
;call MapGoRight_de
DrawWormInMappp2
call DrawWormInMappp
;call MapGoRight_de
;TODO 16c sprites
DrawWormInMappp
_left=0x47
_right=0xb8
push de
push hl
push iy
ld a,(iy)
SETPGC000
ld b,8
DrawWormInMap0
ld a,(de)
rlc (hl)
jr nc,$+4
xor _left
rlc (hl)
jr nc,$+4
xor _right
ld (de),a
inc hl
dec d
bit 6,d
call z,MapNextPg_de
djnz DrawWormInMap0
pop iy
pop hl
pop de
jp MapGoRight_de
DrawWormInMap_right
xor e
and 0xfc ;0..3 x layer
xor e
if SKIPPGS
add a,SKIPPGS
endif
ld ly,a;0
ld hy,tpushpgs/256 ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
srl d
rr e
srl d
rr e
ld a,l ;y
and 0x3f
cpl
;add a,0xc0
ld d,a
;e=0: l=0x3d
;e=1: l=0x3e
;e=2: l=0x39
;e=3: l=0x3a
;...
ld a,e ;x/8
cpl
add a,a
and 0xfc
;inc a ;add a,1;l
rr e
adc a,1
ld e,a
pop hl ;gfx
;DrawWormInMappp_leftcolumn
_left=0x47
_right=0xb8
push de
push hl
push iy
ld a,(iy)
SETPGC000
ld b,8
DrawWormInMap_leftcolumn0
ld a,(de)
rlc (hl)
jr nc,$+4
xor _right
ld (de),a
inc hl
dec d
bit 6,d
call z,MapNextPg_de
djnz DrawWormInMap_leftcolumn0
pop iy
pop hl
pop de
call MapGoRight_de
call DrawWormInMappp2
call DrawWormInMappp
;DrawWormInMappp_rightcolumn
_left=0x47
_right=0xb8
push de
push hl
push iy
ld a,(iy)
SETPGC000
ld b,8
DrawWormInMap_rightcolumn0
ld a,(de)
rlc (hl)
jr nc,$+4
xor _left
ld (de),a
inc hl
dec d
bit 6,d
call z,MapNextPg_de
djnz DrawWormInMap_rightcolumn0
pop iy
pop hl
pop de
;jp MapGoRight_de
MapGoRight_de
;de=map
;iy=tpushpgs+
inc ly
ld a,ly
and 3
ret nz
ld a,ly
sub 4
ld ly,a
inc e
bit 0,e
ret z ;0xfd -> 0xfe
ld a,e
sub 6
ld e,a
ret
PrepareXorPixInMap
ret
XorPixInMap
;e=y (от верхнего края TERRAIN)
;bc=x
LD A,e
add a,MAPHGT-TERRAINHGT
SUB TERRAINHGT;MAPHGT
RET NC
;a=-TERRAINHGT..-1
PUSH BC
PUSH HL
cpl
ld h,a ;~truey
rrca
rrca
rrca
xor c
and 3*8 ;6(7)=xlayer ;3*8=(y/64)*8
xor c
rrca
and 15 ;4 layers with 4 pages each
if SKIPPGS
add a,SKIPPGS
endif
ld (XorPixInMap_pgnum),a ;окупается только при экономии push..pop de
srl b
rr c
ex af,af' ;'
srl b
ld a,c
rra ;x/4
if 1
cpl
;11. -> 100 -> 101
;10. -> 101 -> 110
;01. -> 000 -> 001
;00. -> 001 -> 010
rrca ;"b1" -> b0
rrca ;"b1" -> b7
add a,a;"b1" -> CY
ccf
rla ;~"b1" -> b0
inc a
else
rra ;x/8
cpl
ld c,a ;x/8
add a,a
and 0xfc
rr c
sbc a,-2
endif
ld l,a ;x8=0: 0x3d ;x8=1: 0x3e ;x8=2: 0x39 ;x8=3: 0x3a
ld a,h ;~truey
or 0xc0
ld h,a
XorPixInMap_pgnum=$+1
ld a,(tpushpgs) ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
SETPGC000
ex af,af' ;'
sbc a,a
xor 0x47
xor (hl)
ld (hl),a
POP HL
POP BC
RET
PrepareUnSetPixInMap
ret
UnSetPixInMap
;e=truey ;e=y (от верхнего края TERRAIN)
;bc=x
; LD A,e
; add a,MAPHGT-TERRAINHGT
; SUB TERRAINHGT;MAPHGT
; RET NC ;TODO чтобы не вырезало потолок, если взорван пол! или проверять в самом круге
ld a,e
;a=-TERRAINHGT..-1
;PUSH BC
;PUSH HL
cpl
ld h,a ;~truey
rrca
rrca
rrca
xor c
and 3*8 ;6(7)=xlayer ;3*8=(y/64)*8
xor c
rrca
and 15 ;4 layers with 4 pages each
if SKIPPGS
add a,SKIPPGS
endif
ld (UnSetPixInMap_pgnum),a ;окупается только при экономии push..pop de
srl b
rr c
ex af,af' ;'
srl b
ld a,c
rra ;x/4
if 1
cpl
;11. -> 100 -> 101
;10. -> 101 -> 110
;01. -> 000 -> 001
;00. -> 001 -> 010
rrca ;"b1" -> b0
rrca ;"b1" -> b7
add a,a;"b1" -> CY
ccf
rla ;~"b1" -> b0
inc a
else
rra ;x/8
cpl
ld c,a ;x/8
add a,a
and 0xfc
rr c
sbc a,-2
endif
ld l,a ;x8=0: 0x3d ;x8=1: 0x3e ;x8=2: 0x39 ;x8=3: 0x3a
ld a,h ;~truey
or 0xc0
ld h,a
UnSetPixInMap_pgnum=$+1
ld a,(tpushpgs) ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
SETPGC000
ex af,af' ;'
sbc a,a
xor 0xb8;0x47
and (hl)
ld (hl),a
;POP HL
;POP BC
RET