DrawMASK
call SetPgMask
ld hl,(MOUSEX)
ld a,l
srl h
rra
srl h
rra
srl h
rra
srl h
rra
ld de,SCRTOP
ld hl,MASK
cp MASKWID-SCRWID
jr c,$+4
ld a,MASKWID-SCRWID
ld c,a
ld b,0
add hl,bc
ld b,MASKHGT;SCRHGT
DrawMASK0
push bc
push de
ld bc,SCRWID
ldir
ld bc,MASKWID-SCRWID
add hl,bc
pop de
call DDE
pop bc
djnz DrawMASK0
ret
DrawMapGfx
ld a,0xfe
in a,(0xfe)
rra
rra
jp nc,DrawMASK
ld iy,0
add iy,sp
LD A,PGMAP;16
call OUTME
LD DE,MAPWID
LD hl,(MOUSEY-1) ;h ;8bit
ld L,0
LD B,8
mULH00E ADD HL,HL
JR NC,$+3
ADD HL,DE
DJNZ mULH00E
LD BC,MAPDO
ADD HL,BC
LD BC,(MOUSEX)
DUP 3
SRL B
RR C
EDUP
ADD HL,BC
;HL=mapadr=MAP+MOUSEY*MAPWID+(MOUSEX>3)
;^^^^^^^^^^^^^^^^или по табл
;visiblehgt = SCRHGT
ld de,SCRTOP
ld b,SCRHGT
;skyhgt = DOMAP-MOUSEY
;if skyhgt>=0 then visiblehgt = visiblehgt-skyhgt; y=skyhgt
ld a,(MOUSEY)
sub SKYHGT
jp nc,DrawMap_nosky
push af
push bc
neg
ld b,a ;skyhgt
;ld a,e
;add a,SCRWID-1
;ld e,a
push bc
push de
push hl
ld hl,skysprlist
ld de,skysprlist+1
ld bc,SKYHGT*6-1
ld (hl),0
ldir
ld ix,WORMXY
prskyworms0
ld a,(ix+5)
cp SPRLIST_END
jp z,prskyworms0q
ld a,(MOUSEY)
sub (ix+3) ;y
cpl
;add a,7+1 ;c-MOUSEY+7 = 0..SKYHGT+6
;cp SKYHGT+7
add a,4+1 ;с запасом сверху на 4 (не хватило на высоту червя)
cp SKYHGT+4
jp nc,prskyworms_skip
ld l,a
ld h,0
ld b,h
ld c,l
add hl,hl ;*2
add hl,bc ;*3
add hl,hl ;*6
ld bc,skysprlist-(6*4) ;с запасом сверху на 4 (не хватило на высоту червя)
add hl,bc
ex de,hl
;ld hl,(4+(SCRWID*8))*64 ;x ;XXXXXXXX XXx????? (TODO >>2)
ld a,(ix+0) ;x
ld l,(ix+2) ;X ;XXXXXXXX XXx????? (TODO >>2)
ld h,0
rla
adc hl,hl
rla
adc hl,hl ;000000XX XXXXXXXX
ld bc,(MOUSEX)
or a
sbc hl,bc
ld bc,8
add hl,bc
ld c,8*(SCRWID+1)
or a
sbc hl,bc
add hl,bc
jr nc,prskyworms_skip
ld a,l ;l = x относительно экрана!!! 0=на знакоместо левее экрана
rra
rra
rra
and 31
sub SCRWID+1
ld (prskywormx),a ;(X/8)-(SCRWID+1) !=0
ld a,l
and 7
ld (prskywormrlpatch),a
ld b,(ix+1) ;sprite HSB
ld a,(ix) ;sprite LSB
add a,a
add a,a
add a,a
ld c,a
prskyworm0
ld a,(bc) ;gfx
ld l,a
ld h,0
prskywormrlpatch=$+1
jr $+2
dup 7
add hl,hl
edup
ld a,(de) ;X/8-(SCRWID+1) == 0 значит свободно, иначе занято
or a
prskywormx=$+1
ld a,0
jr nz,prskyworm0tryspr2
ld (de),a
inc e
ld a,h
ld (de),a
inc e
ld a,l
ld (de),a
inc e
inc e
jr z,prskyworms_skip ;выход за пределы skysprlist
inc e
jp prskyworm0tryspr2q
prskyworm0tryspr2
inc e
inc e
inc e
ld (de),a
inc e
jr z,prskyworms_skip ;выход за пределы skysprlist
ld a,h
ld (de),a
inc e
ld a,l
ld (de),a
prskyworm0tryspr2q
inc de
inc c
ld a,c
and 7
jr nz,prskyworm0
prskyworms_skip
ld bc,6
add ix,bc
jp prskyworms0
prskyworms0q
pop hl
pop de
pop bc
ld hl,skysprlist ;80 строк по 6 байт
DrawMap_sky0
push bc
push de
push hl
ld h,d
ld l,e
inc de
ld bc,SCRWID-1
ld (hl),b;0
ldir
;TODO надпечатать спрайты (для MEM128=0)
;допустим, уже составлен список, в каких строках что печатать
;система y,x,data16,pnext (без pnext проблема с сортировкой) займёт слишком много места (20*6*8=960)
;поэтому на каждый "y" неба (всего 80) 2 спрайта по 3 байта: (X/8)-(SCRWID+1),data16 (итого 480, плюс запасы сверху и снизу на высоту червя)
pop hl
if 1
;первый спрайт
ld a,e ;lineaddr+SCRWID
add a,(hl) ;(X/8)-(SCRWID+1)
ld e,a
inc l
ld a,(de)
xor (hl)
ld (de),a
inc l
inc e
ld a,(de)
xor (hl)
ld (de),a
inc l
;второй спрайт
ld a,e
or 0x1f ;FIXME - работает только при SCRWID=30!
add a,(hl) ;(X/8)-(SCRWID+1)
ld e,a
inc l
ld a,(de)
xor (hl)
ld (de),a
inc l
inc e
ld a,(de)
xor (hl)
ld (de),a
inc hl
endif
pop de
pop bc
call DDE
djnz DrawMap_sky0
;ld a,e
;sub SCRWID-1
;ld e,a
ld hl,MAP
LD BC,(MOUSEX)
DUP 3
SRL B
RR C
EDUP
ADD HL,BC
pop bc
pop af
add a,b
ld b,a
DrawMap_nosky
;waterhgt = MOUSEY-waterYwin
;if waterhgt>=0 then visiblehgt = visiblehgt-waterhgt
ld a,(MOUSEY)
sub waterYwin
jr c,DrawMap_nowater
neg
add a,b
ld b,a
DrawMap_nowater
LD A,(MOUSEX)
rra
jp nc,DrawMap_x0246
rra
jp nc,DrawMap_x15
rra
jp c,DrawMap_x7
ld a,Tshift/256 ;x=3
DrawMap_x35_a
inc hl
inc hl
push hl
pop ix
ld h,a ;shift table
ld a,b ;hgt
ld b,d
ld c,e;LD bc,SCRTOP;SHADOW
MAPOUT0
;ix=mapadr
;sp=mapadr
;hl=tab
;bc=screen
;a=hgt
ex af,af' ;'
ld e,(ix-2)
ld d,(ix-1)
ld sp,ix
ld l,e ;%abcdefgh
DUP SCRWID/2
ld a,(hl) ;%defgh000
ld l,d ;%ijklmnop
inc h
or (hl) ;%defghijk
dec h
ld (bc),a
inc c
ld a,(hl) ;%lmnop000
pop de
ld l,e ;%qrstuvwx
inc h
or (hl) ;%lmnopqrs
dec h
ld (bc),a
inc c
EDUP
org $-1
ld a,c
sub SCRWID-1
ld c,a
inc b
ld a,b
and 7
jr z,MAPOUT0_chr
MAPOUT0_chrq
ld sp,iy;SPOILSTACK
LD de,MAPWID
ADD ix,de
ex af,af' ;'
dec a
jp nz,MAPOUT0
;ld sp,iy
ret
MAPOUT0_chr
ld a,c
sub -32
ld c,a
sbc a,a
and -8
add a,b
ld b,a
jp MAPOUT0_chrq
DrawMap_x0
;LD de,SCRTOP;SHADOW
DrawMap_x0line
PUSH bc
PUSH de
;HL=mapadr
ld bc,SCRWID-1
ldir
ld a,(hl)
ld (de),a
POP de
CALL DDE
LD bc,MAPWID-SCRWID+1
ADD HL,bc
POP bc
djnz DrawMap_x0line
ret
DrawMap_x15
rra
ld a,Tshift/256+2 ;x=5
jp c,DrawMap_x35_a
DrawMap_x1
;hl=mapadr
ld a,b
ld bc,SCRWID
add hl,bc
push de;SCRTOP
exx
LD b,a;SCRHGT
pop de
ld hl,SCRWID
add hl,de ;LD hl,SCRTOP+SCRWID;SHADOW
DrawMap_x1line
;hl'=mapadr (end)
;hl=scr (end)
ld sp,hl
exx
ld a,(hl)
rla
dec hl
dup SCRWID/4
ld b,(hl)
dec hl
ld c,(hl)
dec hl
ld d,(hl)
dec hl
ld e,(hl)
rl b
rl c
rl d
rl e
push bc
push de
dec hl
edup
if (SCRWID/2)&1
ld b,(hl)
dec hl
ld c,(hl)
rl b
rl c
push bc
dec hl
endif
org $-1
ld bc,MAPWID+SCRWID
add hl,bc
exx
inc h
ld a,h
and 7
jr z,DrawMap_x1line_chr
;DrawMap_x1line_chrq
dec b
jp nz,DrawMap_x1line
ld sp,iy
ret
DrawMap_x1line_chr
ld a,l
sub -32
ld l,a
sbc a,a
and -8
add a,h
ld h,a
dec b
jp nz,DrawMap_x1line
ld sp,iy
ret
DrawMap_x2
;hl=mapadr
ld a,b
ld bc,SCRWID
add hl,bc
push de;SCRTOP
exx
LD b,a;SCRHGT
pop de
ld hl,SCRWID
add hl,de ;LD hl,SCRTOP+SCRWID;SHADOW
DrawMap_x2line
;hl'=mapadr (end)
;hl=scr (end)
ld sp,hl
exx
ld a,(hl)
rla ;6??????? CY="d7"
dec hl
dup SCRWID/4
ld b,(hl)
dec hl
ld c,(hl)
dec hl
ld d,(hl)
dec hl
ld e,(hl)
rl b
rl c
rl d
rl e
rla;ex af,af' ;'
rl b
rl c
rl d
rl e
push bc
push de
rra;ex af,af' ;'
dec hl
edup
org $-2
if (SCRWID/2)&1
rra;ex af,af' ;'
dec hl
ld b,(hl)
dec hl
ld c,(hl)
rl b
rl c
rla;ex af,af' ;'
rl b
rl c
push bc
endif
ld bc,MAPWID+SCRWID
add hl,bc
exx
inc h
ld a,h
and 7
jr z,DrawMap_x2line_chr
;DrawMap_x2line_chrq
dec b
jp nz,DrawMap_x2line
ld sp,iy
ret
DrawMap_x2line_chr
ld a,l
sub -32
ld l,a
sbc a,a
and -8
add a,h
ld h,a
dec b
jp nz,DrawMap_x2line
ld sp,iy
ret
DrawMap_x04
rra
jp nc,DrawMap_x0
DrawMap_x4
;если более 5 фреймов отпущены кнопки и мышь, то переходим на DrawMap_x5 (чтобы не мерцало) (TODO по направлению движения на 3 или 5, а при вертикальном движении переприсвоить X?)
;ld a,(nokeytimer) ;счётчик фреймов, где не использовалось управление
;cp 5
;ld a,Tshift/256+2 ;x=5
;jp nc,DrawMap_x35_a
ex de,hl;LD hl,SCRTOP;SHADOW
ld ix,3
add ix,de
DrawMap_x4line
;ix=mapadr
ld a,(ix-3)
ld e,(ix-2)
ld d,(ix-1)
ld sp,ix ;mapadr+3, de is ready
ld c,l
dup SCRWID/2
ld (hl),e
rrd ;18t
inc l
ld (hl),d
rrd ;18t
inc l
pop de
edup
org $-2
ld sp,iy;SPOILSTACK
LD de,MAPWID
add ix,de
inc h
ld a,h
and 7
jr z,DrawMap_x4line_chr
ld l,c
;DrawMap_x4line_chrq
dec b
jp nz,DrawMap_x4line
;ld sp,iy
ret
DrawMap_x4line_chr
ld a,c
sub -32
ld l,a
sbc a,a
and -8
add a,h
ld h,a
dec b
jp nz,DrawMap_x4line
;ld sp,iy
ret
DrawMap_x0246
rra
jp nc,DrawMap_x04
rra
jp nc,DrawMap_x2
DrawMap_x6
ex de,hl;LD hl,SCRTOP;SHADOW
ld ix,3
add ix,de
ld a,b
DrawMap_x6line
;ix=mapadr
ex af,af' ;'
ld a,(ix-3)
ld e,(ix-2)
ld d,(ix-1)
ld sp,ix ;mapadr+3, de is ready
rra ;???????1 CY="d0"
x6line_startcritical=$+1
dup SCRWID/4
pop bc
rr e ;restore: -
rr d ;restore: -
rr c ;restore: rl c
rr b ;restore: rl b:rl c
rra ;restore: rla:rl b:rl c
rr e ;restore: rl e:rla:rl b:rl c
rr d ;restore: rl d:rl e:rla:rl b:rl c
rr c ;restore: rl c:rl d:rl e:rla:rl b:rl c
rr b ;restore: rl b:rl c:rl d:rl e:rla:rl b:rl c
ld (hl),e
inc l
ld (hl),d
inc l
ld (hl),c
inc l
ld (hl),b
rla ;restore: rra:rl b:rl c:rl d:rl e:rla:rl b:rl c
inc l ;20+88+28 = 136/4 = 34
pop de ;restore: -
edup
org $-3
if (SCRWID/2)&1
rla
inc l
pop de ;restore: -
rr e ;restore: rl e
rr d ;restore: rl d:rl e
rra ;restore: rla:rl d:rl e
rr e ;restore: rl e:rla:rl d:rl e
rr d ;restore: rl d:rl e:rla:rl d:rl e
ld (hl),e
inc l
ld (hl),d
endif
ld sp,iy;SPOILSTACK
x6line_endcritical
LD de,MAPWID
add ix,de
ld a,l
sub SCRWID-1
ld l,a
inc h
ld a,h
and 7
jr z,DrawMap_x6line_chr
;DrawMap_x6line_chrq
ex af,af' ;'
dec a
jp nz,DrawMap_x6line
;ld sp,iy
ret
DrawMap_x6line_chr
ld a,l
sub -32
ld l,a
sbc a,a
and -8
add a,h
ld h,a
ex af,af' ;'
dec a
jp nz,DrawMap_x6line
;ld sp,iy
ret
if (SCRWID/2)&1
;after ld (hl)
nop
nop
nop
;after rr d
rl d
rl e
rla
;after rr d
rl d
rl e
endif
dup SCRWID/4
;after pop de
jp (hl) ;restore de
;after inc l
nop
;after rla
rra
;after ld (hl)
nop
nop
nop
nop
nop
nop
nop
;after rr b
rl b
rl c
rl d
rl e
rla
;after rr b
rl b
rl c
rl d
rl e
;after pop bc
;for x6line_startcritical
ret ;restore bc
edup
x6line_restorede_startcritical=$-1
DrawMap_x7
ex de,hl;LD hl,SCRTOP;SHADOW
ld ix,3
add ix,de
DrawMap_x7line
;ix=mapadr
ld a,(ix-3)
ld e,(ix-2)
ld d,(ix-1)
ld sp,ix ;mapadr+3, de is ready
ld c,l
rra
dup SCRWID/2
ld a,e
rra
ld (hl),a
inc l
ld a,d
rra
ld (hl),a
inc l
pop de
edup
org $-2
ld sp,iy;SPOILSTACK
LD de,MAPWID
add ix,de
inc h
ld a,h
and 7
jr z,DrawMap_x7line_chr
ld l,c
;DrawMap_x7line_chrq
dec b
jp nz,DrawMap_x7line
;ld sp,iy
ret
DrawMap_x7line_chr
ld a,c
sub -32
ld l,a
sbc a,a
and -8
add a,h
ld h,a
dec b
jp nz,DrawMap_x7line
;ld sp,iy
ret
DrawWater_Amhgt_DEgfx
ld (DrawWaterSP),sp
ld c,a ;-32..-1
and 7
add a,0x50
LD H,A
ld a,c
and 0x18
add a,a
add a,a
add a,0x1f
ld l,a
;LD L,#7F
PRWAT0 LD A,(DE)
INC E
LD C,A
LD A,(DE)
LD B,A
ld a,e
inc e
xor e
and 0xf0
jr z,$+2+4
ld a,e
add a,32
ld e,a
LD SP,HL
DUP 15
PUSH BC
EDUP
;ld l,0x7e
;dup 15
;ld (hl),b
;dec l
;ld (hl),c
;dec l
;edup
;org $-1
;ld a,l
;sub 30
;ld l,a
;ld (hl),c
;inc l
;ld (hl),b ;иначе запарывает 56ff и т.п.
;add a,30
;ld l,a
INC H
BIT 3,H
JR Z,PRWAT0
res 3,h
ld a,l
sub -32
ld l,a
jp p,PRWAT0
DrawWaterSP=$+1
LD SP,0
RET
if 1
DDE
INC D
LD A,D
AND 7
RET NZ
LD A,E
ADD A,32
LD E,A
RET C
LD A,D
ADD A,-8
LD D,A
RET
endif
if 0
DBC
INC B
LD A,B
AND 7
RET NZ
LD A,C
ADD A,32
LD C,A
RET C
LD A,B
ADD A,-8
LD B,A
RET
endif
display "drawmapsize=",$-DrawMap,"+0x400 shifts"