;------------Работа с картой (c #C000)
;align!!!
MPsign ;номера спрайтов для обычн уровней
DEFB 60
DEFS 6,18
DEFS 10,24
DEFS 13,18
DEFB 84,36,84,84,36,84,84,36,84
DEFS 3,96
DEFS 3,30
DEFS 3,96
DEFS 3,18
DEFB 18
DEFS 9,42
DEFS 3,48
DEFS 14,54
DEFB 18
DEFB 78
DEFS 14,66
DEFS 14,72
DEFB 78
DEFS 2,66
DEFS 2,72
DEFS 5,42
DEFS 2,42 ;?
DEFB 84,90,96,102,108,114,120,126
;полезные данные в битах 7..5, но потом прокручиваются вправо и в следующий байт (MP_R2)
MP_IMG DEFW #E0,#80,#80 ;00 люди
DEFW #E0,#80,#A0 ;06 кунги
DEFW #E0,#C0,#A0 ;12 пленник
DEFW #E0,#E0,#E0 ;18 пусто
DEFW #E0,#A0,#E0 ;24 дорожки
DEFW #40,#40,#40 ;30 мост гор
DEFW #00,#E0,#00 ;36 мост вер
water DEFW #E0,#A0,#40 ;42 вода
DEFW #C0,#80,#00 ;48 лес
DEFW #A0,#40,#A0 ;54 забор
DEFW #00,#40,#00 ;60 рамка
DEFW #80,#40,#40 ;66 здания люди
DEFW #40,#20,#40 ;72 здания кунги
DEFW #00,#60,#00 ;78 строительство
DEFW #A0,#A0,#A0 ;84 |
DEFW #E0,#80,#A0 ;90 |~
DEFW #E0,#00,#E0 ;96 ~
DEFW #E0,#00,#C0 ;102 ~|
DEFW #C0,#C0,#C0 ;108 |
DEFW #C0,#C0,#00 ;114 _|
DEFW #E0,#E0,#00 ;120 _
DEFW #A0,#A0,#80 ;126|_
MP_LEN EQU $-MP_IMG
mnt EQU 72 ;горы
MPsig2 ;номера спрайтов для подземелий
DEFS 1,60
DEFS 3,18
DEFS 2,48
DEFS 1,18
DEFS 2,#0
DEFS 33,24
DEFS 10,#0
DEFS 2,30
DEFS 2,#0
DEFS 1,42
DEFS 2,mnt
DEFS 2,54
DEFS 1,30
DEFS 1,#0
DEFS 1,24
DEFS 15,#0
DEFS 9,54
DEFS 1,60 ;внутр гор
DEFS 14,mnt
DEFS 10,60
DEFS 1,42
DEFS 2,mnt
DEFS 2,54
MPswap ;сменить нумерацию спрайтов для подземелий
LD A,(LEV_T)
OR A
RET Z
LD HL,MPsign
LD DE,MPsig2
LD B,118
MPsw0 LD A,(DE)
LD C,(HL)
LD (HL),A
LD A,C
LD (DE),A
INC L
INC E
DJNZ MPsw0
RET
MP_ANI LD A,(isANI)
OR A
RET Z
LD DE,water
LD HL,water+2
LD A,(DE)
LDI
LDI
LDI
INC DE
LD (DE),A
LD HL,MP_IMG+10
CALL MP_an
LD HL,MP_IMG+14
CALL MP_an
INC HL
INC HL
MP_an LD A,(HL)
XOR #60
LD (HL),A
RET
if EGA==0
MP_R1 PUSH HL
LD HL,MP_IMG
LD B,MP_LEN/2
mp01 SRL (HL)
INC HL
INC HL
DJNZ mp01
POP HL
RET
MP_R2 PUSH HL
LD HL,MP_IMG
LD B,MP_LEN/2
mp02 SRL (HL)
INC HL
RR (HL)
INC HL
DJNZ mp02
POP HL
RET
endif
MP_OU1 ;HL -адр экр
;вывод столбца карты, если сдвинутое значение умещается в байт
LD C,64
mp03 CALL MP_SPA ;->de адр спр
JR Z,mp041
if EGA
push bc
call setpgsscr40008000
pop bc
endif
LD B,3
mp05
if EGA
push bc
push de
push hl
ld a,(de)
ld e,a
xor a
rl e
jr nc,$+4
or 0x47 ;L
rl e
jr nc,$+4
or 0xb8 ;R
XOR (HL)
LD (HL),A
ld a,0x9f;0xa0
cp h
ld bc,0x4000
adc hl,bc
jp pe,MP_OU1column_noxor ;в половине случаев
;8000->с000 (надо 6000) или a000->e001 (надо 4001)
inc a
xor h
ld h,a
MP_OU1column_noxor
rl e
jr nc,$+2+4
ld a,0x47 ;L
XOR (HL)
LD (HL),A
pop hl
pop de
pop bc
inc de
inc de
else ;~EGA
LD A,(DE)
XOR (HL)
LD (HL),A
INC DE
INC DE
endif
if EGA
ld a,l
add a,40
ld l,a
jr nc,$+3
inc h
else
INC H
LD A,H
AND 7
JR NZ,mp04
LD A,L
ADD A,32
LD L,A
JR C,mp04
LD A,H
SUB 8
LD H,A
mp04
endif
DJNZ mp05
if EGA
push bc
call setpgsmain40008000
pop bc
endif
mp041 DEC C
JR NZ,mp03
RET
MP_OU2 ;HL -адр экр
;вывод столбца карты
LD C,64
mp43 CALL MP_SPA ;->de адр спр
JR Z,mp441
if EGA
push bc
call setpgsscr40008000
pop bc
endif
LD B,3
mp45
if EGA
push bc
push de
push hl
ld a,(de)
add a,a
ld e,a
jr nc,$+2+4
ld a,0xb8 ;R
XOR (HL)
LD (HL),A
ld a,0x9f;0xa0
cp h
ld bc,0x4000
adc hl,bc
jp pe,MP_OU2column_noxor ;в половине случаев
;8000->с000 (надо 6000) или a000->e001 (надо 4001)
inc a
xor h
ld h,a
MP_OU2column_noxor
xor a
rl e
jr nc,$+4
or 0x47 ;L
rl e
jr nc,$+4
or 0xb8 ;R
XOR (HL)
LD (HL),A
pop hl
pop de
pop bc
inc de
inc de
else ;~EGA
LD A,(DE)
XOR (HL)
LD (HL),A
INC DE
if EGA
inc hl
else
INC L
endif
LD A,(DE)
XOR (HL)
LD (HL),A
if EGA
dec hl
else
DEC L
endif
INC DE
endif
if EGA
ld a,l
add a,40
ld l,a
jr nc,$+3
inc h
else
INC H
LD A,H
AND 7
JR NZ,mp44
LD A,L
ADD A,32
LD L,A
JR C,mp44
LD A,H
SUB 8
LD H,A
mp44
endif
DJNZ mp45
if EGA
push bc
call setpgsmain40008000
pop bc
endif
mp441 DEC C
JR NZ,mp43
RET
if EGA
MP_OU32_64
LD (MP_sub+1),bc
LD B,32
MP_OUT0
push bc
PUSH HL
PUSH DE
CALL MP_SET
MP_sub CALL MP_OU1
POP DE
POP HL
ld bc,0x4000
ld lx,3
MP_OUT0_3
ld a,0x9f;0xa0
cp h
adc hl,bc
jp pe,MP_OUT0_noxor ;в половине случаев
;8000->с000 (надо 6000) или a000->e001 (надо 4001)
inc a
xor h
ld h,a
MP_OUT0_noxor
dec lx
jr nz,MP_OUT0_3
pop bc
inc e
inc e
DJNZ MP_OUT0
RET
else ;~EGA
MP_OU8 PUSH HL
PUSH DE
LD B,8
mp11 PUSH BC
PUSH HL
PUSH DE
CALL MP_SET
MP_sub CALL MP_OU1
POP DE
POP HL
POP BC
if EGA
inc hl
inc hl
inc hl
else
INC L
INC L
INC L
endif
LD A,E
ADD A,8
LD E,A
DJNZ mp11
POP DE
POP HL
RET
endif
MP_OUT
CALL MPswap
CALL MP_OFF ;очистка
CALL MP_ANI
if EGA
;00 01 11 22|23 33 44 45|55 66 67 77|
;jr $
LD bc,MP_OU1
ld hl,scrbase;0x4000
LD DE,MAP
CALL MP_OU32_64
LD bc,MP_OU2
ld hl,scrbase+0x4000;0x8000
LD DE,MAP+1
CALL MP_OU32_64
JP MPswap
else ;~EGA
LD HL,DSCR
LD DE,MAP
LD B,6
mp19 PUSH BC
CALL MP_OU8
if EGA
inc hl
else
INC L
endif
INC E
INC E
INC E
POP BC
PUSH BC
LD A,B
CP 1
PUSH AF
CALL NZ,MP_R1
POP AF
CALL Z,MP_R2
POP BC
LD A,B
CP 4
JR Z,mp17
CP 1
JR NZ,mp18
mp17
if EGA
dec hl
dec hl
dec hl
else
DEC L
DEC L
DEC L
endif
LD A,E
SUB 8
LD E,A
mp18 DJNZ mp19
LD BC,MP_OU2
LD (MP_sub+1),BC
CALL MP_OU8
CALL MP_R2
if EGA
inc hl
else
INC L
endif
INC E
INC E
INC E
CALL MP_OU8
CALL MP_R2
LD HL,MP_OU1
LD (MP_sub+1),HL
;MP_Re
LD HL,MP_IMG+1
LD DE,MP_IMG
LD BC,MP_LEN-1
LDIR
XOR A
LD (DE),A
JP MPswap
endif
MP_SET ;уст.на карту (DE-адрес)
PUSH DE
EXX
POP HL
LD BC,64
EXX
RET
MP_SPA EXX ;Z-невид; NZ-видим ;->DE adr
LD A,(HL)
RLCA
JR C,mpsN
SET 4,H ;MAP->MAP2
LD A,(HL)
RES 4,H
CP #80
JR NC,mpHE
LD A,(HL)
ADD HL,BC
EXX
LD D,#C0
LD E,A
LD A,(DE)
ADD A,#80
LD E,A
RET
mpHE ;герои
ADD HL,BC
CP #B0
JR NC,mpH1
EXX
LD DE,MP_IMG
RET
mpH1 CP #E0
JR NC,mpH2
EXX
LD DE,MP_IMG+6
RET
mpH2 EXX
LD DE,MP_IMG+12
AND A
RET
mpsN ADD HL,BC ;невидим поле
EXX
if EGA
ld a,l
add a,40*3
ld l,a
jr nc,$+3
inc h
else
LD A,H
ADD A,3
LD H,A
AND 7
CP 3
JR NC,mps4
LD A,L
ADD A,32
LD L,A
JR C,mps4
LD A,H
SUB 8
LD H,A
mps4
endif
XOR A
RET
display $,"<=0xc300"