Rev 1504 |
Blame |
Compare with Previous |
Last modification |
View Log
| Download
| RSS feed
;╨┐╤А╨╛╤Ж╨╡╨┤╤Г╤А╤Л ╨┤╨╗╤П ╨│╨╡╨╜╨╡╤А╨░╤Ж╨╕╨╕ ╨║╨░╤А╤В╤Л, ╨╜╨╕╨╢╨╜╨╡╨│╨╛ ╤Г╤А╨╛╨▓╨╜╤П (╨╖╨░╨▓╨╕╤Б╤П╤В ╨╛╤В ╤В╨╕╨┐╨░ ╤Н╨║╤А╨░╨╜╨░)
ClearMap
ld hl,tpushpgs +SKIPPGS ;╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 0 ╤Б╨╗╨╛╤П, ╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 1 ╤Б╨╗╨╛╤П, ╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 2 ╤Б╨╗╨╛╤П, ╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 3 ╤Б╨╗╨╛╤П, ╨▓╤В╨╛╤А╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 0 ╤Б╨╗╨╛╤П...
ld b,16
ClearMap0
push bc
push hl
ld a,(hl)
SETPGC000
ld hl,0xc000
xor a
ClearMap1
inc l
ld (hl),a
inc l
ld (hl),a
inc l
inc l ;skip push
jr nz,ClearMap1
inc h
jr nz,ClearMap1
pop hl
pop bc
inc hl
djnz ClearMap0
ret
MapNextPg
push af
push bc
ld a,ly
sub 4
ld ly,a
ld a,(iy)
SETPGC000
pop bc
pop af
ld h,0xff
ret
MapNextPg_de
push af
push bc
ld a,ly
sub 4
ld ly,a
ld a,(iy)
SETPGC000
pop bc
pop af
ld d,0xff
ret
FindPlacesForGrass ;╨╖╨░╨┐╨╕╤Б╤Л╨▓╨░╨╡╤В ╨▓ grassbuf
;╨┐╨╛ ╤З╤С╤В╨╜╤Л╨╝ ╤Б╤В╨╛╨╗╨▒╤Ж╨░╨╝ ╤Б╨▓╨╡╤А╤Е╤Г ╨▓╨╜╨╕╨╖ ╨╕╤Й╨╡╨╝ ╨┐╨╡╤А╨╡╤Е╨╛╨┤╤Л 0->1
ld de,grassbuf
ld c,0xfd
ld b,+(MAPWID+1)/2
xor a ;RLE counter
ex af,af' ;'
findgrass_columns0
call findgrass_column4
inc c
call findgrass_column4
ld a,c
sub 5
ld c,a
djnz findgrass_columns0
xor a
ld (de),a;0 ;╨╕╨╜╨░╤З╨╡ ╨▓ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╡╨╝ ╤Б╤В╨╛╨╗╨▒╤Ж╨╡ ╨╝╨╛╨╢╨╡╤В ╨┐╨╛╤П╨▓╨╕╤В╤М╤Б╤П ╨╗╨░╨╢╨░
ret
findgrass_column4
ld iy,tpushpgs +SKIPPGS+12 ;╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 0 ╤Б╨╗╨╛╤П, ╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 1 ╤Б╨╗╨╛╤П, ╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 2 ╤Б╨╗╨╛╤П, ╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 3 ╤Б╨╗╨╛╤П, ╨▓╤В╨╛╤А╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 0 ╤Б╨╗╨╛╤П...
call findgrass_column2
findgrass_column2
call findgrass_column
findgrass_column
;iy=tpushpgs+
;c=LSB of addr
;de=gfx
push bc
push iy
ld a,(iy)
ld h,0xff
ld l,c
SETPGC000
ld b,BIGMAPHGT-1;MAPHGT-1
findgrass1
ld a,(hl)
cpl
and 0x47;c
dec h ;dec h - ╤Н╤В╨╛ ╤Б╨▓╨╡╤А╤Е╤Г ╨▓╨╜╨╕╨╖!
bit 6,h
;jr z,$
call z,MapNextPg
and (hl)
ex af,af' ;'
inc a
jr nz,findgrass_nooverflow
ld (de),a;0 ;0=╨┐╤А╨╛╤Б╤В╨╛ ╨┐╤А╨╛╨┐╤Г╤Б╨║ 255 ╨┐╨╕╨║╤Б
inc de
ld a,d
cp (grassbuf+grassbufsz)/256
jp z,nowhere ;buffer overflow
ld a,1
findgrass_nooverflow
ex af,af' ;'
jr z,findgrass_empty
;ld a,(hl)
;xor 0x80
;ld (hl),a
ex af,af' ;'
ld (de),a
inc de
ld a,d
cp (grassbuf+grassbufsz)/256
jp z,nowhere ;buffer overflow
xor a
ex af,af' ;'
findgrass_empty
djnz findgrass1
pop iy
pop bc
inc ly
ret
MakeMaskFromMap
;FIXME ╨▓ ╤Б╨╗╤Г╤З╨░╨╡ ╨╜╨╡╨┐╨╛╨╗╨╜╨╛╨╣ ╨╝╨░╤Б╨║╨╕ (╨╜╤Г╨╢╨╜╨░ ╨╖╨░╤Й╨╕╤В╨░ ╨╛╤В ╨▓╨╗╨╡╤В╨░╨╜╨╕╤П ╨▓ ╤Б╤В╨╡╨╜╤Г ╨╜╨░ ╨║╤А╨░╤О ╨║╨░╤А╤В╤Л - ╨╜╨░╨┤╨╛ ╨┐╨╛╨╗╨╜╤Г╤О ╨╝╨░╤Б╨║╤Г ╨╕╨╗╨╕ ╨┐╤А╨╕ ╨╗╤О╨▒╨╛╨╣ ╨┐╨╛╤А╤З╨╡ ╨╗╨░╨╜╨┤╤И╨░╤Д╤В╨░ ╨║╤А╨░╨╣╨╜╨╕╨╣ ╨╗╨╡╨▓╤Л╨╣ ╨┐╨╕╨║╤Б ╨╝╨░╤Б╨║╨╕ ╤Д╨╛╤А╨╝╨╕╤А╨╛╨▓╨░╤В╤М ╨╕╨╖ 5 ╨╗╨╡╨▓╤Л╤Е ╨┐╨╕╨║╤Б, ╤Б╨┐╤А╨░╨▓╨░ ╨░╨╜╨░╨╗╨╛╨│╨╕╤З╨╜╨╛?)
;TODO x ╨▓ ╨╝╨░╤Б╨║╨╡ ╤Б╤З╨╕╤В╨░╨╡╤В╤Б╤П ╨┤╨╗╤П ╤Ж╨╡╨╜╤В╤А╨░ ╤З╨╡╤А╨▓╤П, x=0 ╤Б╨╛╨╛╤В╨▓╨╡╤В╤Б╤В╨▓╤Г╨╡╤В x=4 ╨▓ ╨║╨░╤А╤В╨╡
;╤В╨╛ ╨╡╤Б╤В╤М ╨▒╨╡╤А╤С╨╝ ╨▒╨░╨╣╤В ╨╝╨░╤Б╨║╨╕ ╨╕╨╖ ╨║╨░╤А╤В╤Л ╤В╨░╨║: ----M-M- M-M-m-m- m-m-----
call SetPgMask8000
if 0;1
ld hl,MASK -0x4000
ld de,MASK+1 -0x4000
ld bc,MASKSZ-1
ld (hl),0
ldir
endif
ld hl,MASKDO -0x4000
ld e,0xfd
ld b,MASKWID
MakeMaskFromMap0
call MakeMaskFromMap_column4
inc e
call MakeMaskFromMap_column4 ;hl is same
inc hl
ld a,e
sub 5
ld e,a
djnz MakeMaskFromMap0
call setpgsmain40008000
call SetPgMask
if 0;1
LD HL,MASKSZ+MASK-(MASKWID*2) ;fill last lines (╨║╨╛╤Б╤В╤Л╨╗╤М, ╨┐╨╛╨║╨░ ╨║╨░╤А╤В╤Л ╨╜╨╡╤В)
LD BC,+(MASKWID*2)*256+255
LD (HL),C
INC HL
DJNZ $-2
endif
;extra bottom line of mask is always filled (for element placement)
LD HL,MASKSZ+MASK
LD BC,MASKWID*256+255
LD (HL),C
INC HL
DJNZ $-2
ret
MakeMaskFromMap_column4
ld iy,tpushpgs+SKIPPGS +12 ;╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 0 ╤Б╨╗╨╛╤П, ╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 1 ╤Б╨╗╨╛╤П, ╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 2 ╤Б╨╗╨╛╤П, ╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 3 ╤Б╨╗╨╛╤П, ╨▓╤В╨╛╤А╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 0 ╤Б╨╗╨╛╤П...
call MakeMaskFromMap_column2
MakeMaskFromMap_column2
call MakeMaskFromMap_column
MakeMaskFromMap_column
;e=LSB of addr
;iy=tpushpgs+
;hl=mask
push bc
push de
push hl
push iy
ld a,(iy)
SETPGC000
ld d,0xff-8 ;╤Б╨▓╨╡╤А╤Е╤Г ╨▓╨╜╨╕╨╖ ;-8, ╨┐╨╛╤В╨╛╨╝╤Г ╤З╤В╨╛ ╨╝╨░╤Б╨║╨░ ╨┤╨╗╤П ╨╜╨╛╨│ ╤З╨╡╤А╨▓╤П
ld bc,MASKWID
ld hx,+((BIGMAPHGT-8)/2)&0xff
MakeMaskFromMap_column0
ld a,(de)
rla
rl (hl)
add hl,bc
dec d
dec d
bit 6,d
call z,MapNextPg_de
dec hx
jr nz,MakeMaskFromMap_column0
;jr $
pop iy
pop hl
pop de
pop bc
inc ly
ret
TexturizeGroundInMap
call SetPgTexture8000
ld de,0x8000
ld c,0xfd ;c=LSB of addr
TexturizeGroundInMap0
call TexturizeGroundInMappp4
inc c
call TexturizeGroundInMappp4
ld a,c
sub 5
ld c,a
jr nc,TexturizeGroundInMap0
jp setpgsmain40008000
TexturizeGroundInMappp4
;c=LSB of addr
ld hl,tpushpgs +SKIPPGS+12 ;╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 0 ╤Б╨╗╨╛╤П, ╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 1 ╤Б╨╗╨╛╤П, ╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 2 ╤Б╨╗╨╛╤П, ╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 3 ╤Б╨╗╨╛╤П, ╨▓╤В╨╛╤А╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 0 ╤Б╨╗╨╛╤П...
call TexturizeGroundInMappp2
TexturizeGroundInMappp2
call TexturizeGroundInMappp
TexturizeGroundInMappp
;hl=tpushpgs+
;c=LSB of addr
;de=gfx
push hl
ld b,4
TexturizeGround0
push bc
push hl
ld a,(hl)
ld h,0xff
ld l,c
SETPGC000
push de
ld b,64
TexturizeGround1
ld a,(de)
inc e
and (hl)
ld (hl),a
dec h
djnz TexturizeGround1
ld a,e
pop de
xor e
and 0x7f
xor e
ld e,a
pop hl
pop bc
dec l
dec l
dec l
dec l
djnz TexturizeGround0
ld hl,128
add hl,de
ex de,hl
pop hl
res 5,d
inc l
ret
AddGrassInMap
ld ix,grassbuf
ld c,0xfd ;c=LSB of addr
ld b,+(MAPWID+1)/2
xor a ;RLE counter
ex af,af' ;'
addgrass_columns0
call addgrass_column4
inc c
call addgrass_column4
ld a,c
sub 5
ld c,a
djnz addgrass_columns0
ret
addgrass_column4
ld iy,tpushpgs +SKIPPGS+12 ;╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 0 ╤Б╨╗╨╛╤П, ╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 1 ╤Б╨╗╨╛╤П, ╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 2 ╤Б╨╗╨╛╤П, ╨┐╨╡╤А╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 3 ╤Б╨╗╨╛╤П, ╨▓╤В╨╛╤А╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ 0 ╤Б╨╗╨╛╤П...
call addgrass_column2
addgrass_column2
call addgrass_column
addgrass_column
;iy=tpushpgs+
;c=LSB of addr
;de=gfx
push bc
push iy
ld a,(iy)
ld h,0xff
ld l,c
SETPGC000
ld b,BIGMAPHGT-1;MAPHGT-1
addgrass0
;dec h
;bit 6,h
;call z,MapNextPg
ex af,af' ;'
addgrass_noadd1
inc a
cp (ix)
jr nz,addgrass_noadd
inc ix
or a
jr z,addgrass_noadd1 ;0=╨┐╤А╨╛╤Б╤В╨╛ ╨┐╤А╨╛╨┐╤Г╤Б╨║ 255 ╨┐╨╕╨║╤Б
push bc
push hl
push iy
LD de,grass16
ld a,ly
and 3 ;xphase
add a,a
add a,a
add a,a
add a,e
ld e,a
jr nc,$+3
inc d
addgrass1
ld a,(de)
or a
jr z,addgrass1q
and 0x47
jr z,addgrass_noleft
xor (hl)
and 0x47
xor (hl)
ld (hl),a
addgrass_noleft
ld a,(de)
and 0xb8
jr z,addgrass_noright
xor (hl)
and 0xb8
xor (hl)
ld (hl),a
addgrass_noright
dec h
bit 6,h
call z,MapNextPg
inc de
djnz addgrass1 ;╤З╤В╨╛╨▒╤Л ╨╜╨╡ ╨▓╤Л╨╗╨╡╤В╨╡╤В╤М ╨╖╨░ ╨║╨░╤А╤В╤Г
addgrass1q
pop iy
ld a,(iy)
SETPGC000
pop hl
pop bc
xor a
addgrass_noadd
ex af,af' ;'
dec h
bit 6,h
call z,MapNextPg
djnz addgrass0
pop iy
pop bc
inc ly
ret
PRLMNerror
INC C ;don't fit, next x
POP DE
LD A,C
CP MASKWID-5 ;╤И╨╕╤А╨╕╨╜╨░ ╤Н╨╗╨╡╨╝╨╡╨╜╤В╨░ ╨╜╨╡ ╨▒╨╛╨╗╨╡╨╡ 10 ╨╖╨╜╨░╨║╨╛╨╝╨╡╤Б╤В
jp C,PRLMN00
; pop de
pop af
; scf
ret
PRLMN
;draw element in map and mask
;c=X (in chr)
;b=N
call SetPgLmn8000
ld a,b
SCF
rla ;a=N*2+1
LD HL,LMNS
PRLMN0 LD E,(HL)
INC HL
LD D,(HL) ;size in bytes
INC HL
DEC A
JR Z,PRLMNO
ADD HL,DE
JR PRLMN0
PRLMNO
LD D,(HL) ;width
INC HL
LD E,(HL) ;hgt
INC HL
call SetPgMask
;TODO
ret ;FIXME
PUSH HL ;gfx
PRLMN00
LD HL,MASK+(MASKWID*(MAPHGT-TERRAINHGT));MASKBUF+(MASKWID*(MAPHGT-TERRAINHGT))
XOR A
LD B,A
ADD HL,BC ;+x
LD B,E ;hgt
PUSH DE
LD DE,MASKWID
;╨╡╤Б╤В╤М ╨╗╨╕ ╨┤╨╛╤Б╤В╨░╤В╨╛╤З╨╜╨░╤П ╨▓╤Л╤Б╨╛╤В╨░ ╨╜╨╡╨▒╨░ ╨┐╨╛╨┤ ╤Н╨╗╨╡╨╝╨╡╨╜╤В?
OR (HL)
ADD HL,DE
DJNZ $-2
jr NZ,PRLMNerror ;don't fit, next x
;╨╕╤Й╨╡╨╝ ╨│╤А╤Г╨╜╤В (╨╛╨╜ ╤В╨╛╤З╨╜╨╛ ╨╡╤Б╤В╤М, ╨╝╤Л ╨▓ ╨╝╨░╤Б╨║╨╡ ╤Б╨┤╨╡╨╗╨░╨╗╨╕ ╨╗╨╕╤И╨╜╤О╤О ╨╖╨░╨╗╨╕╤В╤Г╤О ╤Б╤В╤А╨╛╨║╤Г)
INC B
OR (HL)
ADD HL,DE
JR Z,$-3
POP DE
LD A,D ;wid
DEC A
RRA
NEG
ADD A,C
LD C,A ;x
ld a,b
add a,MAPHGT-TERRAINHGT
ld b,a ;y
;PGMASK ╤Г╨╢╨╡ ╨▓╨║╨╗╤О╤З╨╡╨╜╨╛
;b=y
;c=x
;d=width
;e=hgt
POP HL ;gfx
PUSH BC ;c=x
XOR A
OR B ;y
PUSH HL ;gfx
PUSH DE ;width,hgt
LD HL,MASK;MASKBUF
LD DE,MASKWID
JR Z,$+5
ADD HL,DE
DJNZ $-1 ;hl=MASK+(y*MASKWID)
ADD HL,BC ;hl=MASK+(y*MASKWID)+x
POP BC ;width,hgt
POP DE ;gfx
;hl=MASK+
;de=gfx
;b=width
;c=hgt
PRLMNmask1
PUSH BC
PUSH HL
xor a
ld c,a
PRLMNmask2
LD A,(DE)
rra
rl c
rra
rr c
push af
OR (HL)
LD (HL),A
INC HL
INC DE
pop af
DJNZ PRLMNmask2
ld a,0
rra
rl c
rra
OR (HL)
LD (HL),A
POP HL
LD C,MASKWID
ADD HL,BC
POP BC
DEC C
JR NZ,PRLMNmask1
ex de,hl
LD D,(HL) ;width
INC HL
LD E,(HL) ;hgt
INC HL
POP BC
PUSH BC
XOR A
OR B ;y
PUSH HL ;gfx
PUSH DE ;width,hgt
LD HL,MAP;+(MAPWID*(MAPHGT-TERRAINHGT));#C000
LD DE,MAPWID*2
JR Z,$+5
ADD HL,DE
DJNZ $-1
ADD HL,BC
ADD HL,BC ;hl=MAP+(y*MAPWID*2)+(x*2)
;TODO
;LD A,PGMAP;16
;CALL OUTME
POP BC ;width,hgt
POP DE ;gfx
;TODO
LD A,B ;width
POP BC ;c=x
ADD A,C
LD C,A ;update x (╤З╤В╨╛╨▒╤Л ╨╜╨╡ ╨╗╨╡╨┐╨╕╤В╤М ╨╛╨▒╤К╨╡╨║╤В╤Л ╤Б╨╛╨▓╤Б╨╡╨╝ ╤А╤П╨┤╨╛╨╝)
;or a ;NC
RET
if 0
CheckGroundExist ;╨┐╤А╨╛╨▓╨╡╤А╤П╨╡╨╝, ╨╡╤Б╤В╤М ╨╗╨╕ ╨╖╨╡╨╝╨╗╤П ╨╜╨░ ╨╜╨╕╨╢. ╨╗╨╕╨╜╨╕╨╕ (CY=error)
;TODO
xor a
inc a
ret nz
scf
ret ;error ;╨╜╨╡╤В ╨╖╨╡╨╝╨╗╨╕ ╨╜╨░ ╨╜╨╕╨╢. ╨╗╨╕╨╜╨╕╨╕
endif
EorFillInMap
ld c,0xfd ;c=LSB of addr
EorFillInMap0
call EorFillInMap_column4
inc c
call EorFillInMap_column4
ld a,c
sub 5
ld c,a
jr nc,EorFillInMap0
ret
EorFillInMap_column4
;c=LSB of addr
ld iy,tpushpgs + SKIPPGS+12
call EorFillInMap_column2
EorFillInMap_column2
call EorFillInMap_column
EorFillInMap_column
xor a ;TODO 0xff ╨┤╨╗╤П ╨┐╨╡╤Й╨╡╤А
;a=╨╜╨░╨║╨╛╨┐╨╗╨╡╨╜╨╜╤Л╨╣ ╨▒╨░╨╣╤В
;iy=tpushpgs+
;c=LSB of addr
;b=╤З╨╕╤Б╨╗╨╛ ╤Б╤В╤А╨░╨╜╨╕╤Ж ╨╛╤Б╤В╨░╨╗╨╛╤Б╤М ╨▓ ╤Н╤В╨╛╨╝ ╤Б╤В╨╛╨╗╨▒╤Ж╨╡
push bc
push iy
push af
ld a,(iy)
ld h,0xff
ld l,c
SETPGC000
pop af
LD B,BIGMAPHGT&0xff
MKMAPF0 XOR (HL)
LD (HL),A
dec h
bit 6,h
call z,MapNextPg
DJNZ MKMAPF0
pop iy
pop bc
inc ly
ret