;-----ЧВ Работа со спрайтами ---
step_B EQU 0 ;нач шаг курс
oumDEL EQU 3 ;задержка на вывод карты
ouFAST EQU 5 ;ускорение вывода экрана
;---выв.спрайтов карты----
SQROUT ;hl-adr spr ;DE-scr adr
if EGA
call setpgsscr40008000
endif
LD B,D
LD C,E
LD E,(HL)
INC L
LD D,(HL)
INC L
if EGA
LD (SQUsp),SP
LD SP,HL
LD L,C
LD H,B
ld hx,16/4
jp prtile16columngo
prtile16column
POP DE
prtile16columngo
ld bc,40
LD (HL),E ;0
add hl,bc
LD (HL),D
add hl,bc
POP DE
LD (HL),E ;1
add hl,bc
LD (HL),D
add hl,bc
POP DE
LD (HL),E ;2
add hl,bc
LD (HL),D
add hl,bc
POP DE
LD (HL),E ;3
add hl,bc
LD (HL),D
add hl,bc
POP DE
LD (HL),E ;+0
add hl,bc
LD (HL),D
add hl,bc
POP DE
LD (HL),E ;+1
add hl,bc
LD (HL),D
add hl,bc
POP DE
LD (HL),E ;+2
add hl,bc
LD (HL),D
add hl,bc
POP DE
LD (HL),E ;+3
add hl,bc
LD (HL),D
ld bc,0x4000-(15*40)
ld a,0x9f;0xa0
cp h
adc hl,bc ;de = 0x4000 - ((sprhgt-1)*40)
jp pe,prtile16column ;в половине случаев
;8000->с000 (надо 6000) или a000->e001 (надо 4001)
inc a
xor h
ld h,a
dec hx
jp nz,prtile16column
SQUsp=$+1
ld sp,0
jp setpgsmain40008000
else ;~EGA
LD (SET_SP+1),SP
LD SP,HL
LD L,C
LD H,B
LD B,2
SQU1 LD (HL),E ;0
INC H
LD (HL),D
INC H
POP DE
LD (HL),E ;1
INC H
LD (HL),D
INC H
POP DE
LD (HL),E ;2
INC H
LD (HL),D
INC H
POP DE
LD (HL),E ;3
INC H
LD (HL),D
POP DE
LD A,L
ADD A,32
LD L,A
LD A,H
SUB 7
LD H,A
LD (HL),E ;+0
INC H
LD (HL),D
INC H
POP DE
LD (HL),E ;+1
INC H
LD (HL),D
INC H
POP DE
LD (HL),E ;+2
INC H
LD (HL),D
INC H
POP DE
LD (HL),E ;+3
INC H
LD (HL),D
POP DE
LD A,H
SUB 7
LD H,A
LD A,L
SUB 31
LD L,A
DJNZ SQU1
JP SET_SP
endif ;~EGA
P12X12 LD HL,(X0)
CALL GMAP
if EGA
;call setpgsscr40008000
LD DE,scrbase
else
LD DE,DSCR
endif
LD C,12
PX0 LD B,12
PX1 PUSH BC
PUSH HL ;adr in map
PUSH DE ;adr in scr
CALL GSADR
CALL NC,SQROUT
POP DE
POP HL
POP BC
if EGA
INC E
INC E
else
INC E
INC E
endif
INC HL
DJNZ PX1
if EGA
push hl
ld hl,-24+(40*16)
add hl,de
ex de,hl
pop hl
else
LD A,E
ADD A,40
LD E,A
JR NC,PX2
LD A,D
ADD A,8
LD D,A
PX2
endif
LD A,L
ADD A,52
JR NC,PX3
INC H
PX3 LD L,A
DEC C
JR NZ,PX0
if EGA
;call setpgsmain40008000
endif
RET
N12X12 ;покрытие невидимых полей
LD HL,(X0)
CALL GMAP
if EGA
;call setpgsscr40008000
LD DE,scrbase
else
LD DE,DSCR
endif
LD C,12
NPX0 LD B,12
NPX1 LD A,(HL)
RLA
JR NC,NPXN
PUSH BC
PUSH HL ;adr in map
PUSH DE ;adr in scr
if EGA
ld a,28
call _128
ld hl,128*(383-256)+0xc000 ;тайл 383
else
LD HL,shadwA
endif
CALL SQROUT
POP DE
POP HL
POP BC
NPXN
if EGA
INC E
INC E
else
INC E
INC E
endif
INC HL
DJNZ NPX1
if EGA
push hl
ld hl,-24+(40*16)
add hl,de
ex de,hl
pop hl
else
LD A,E
ADD A,40
LD E,A
JR NC,NPX2
LD A,D
ADD A,8
LD D,A
NPX2
endif
LD A,L
ADD A,52
JR NC,NPX3
INC H
NPX3 LD L,A
DEC C
JR NZ,NPX0
if EGA
;call setpgsmain40008000
endif
RET
;вывод строчки при скролле
PXLO LD HL,(X0)
LD DE,DSCR+#10C0
LD A,11
ADD A,H
LD H,A
JR Px_
PXHI LD HL,(X0)
LD DE,DSCR
Px_ CALL GMAP
LD B,12
PxH1 PUSH BC
PUSH HL ;adr in map
PUSH DE ;adr in scr
CALL GSADR
if EGA==0 ;TODO
CALL NC,SQROUT
endif
POP DE
POP HL
POP BC
INC E
INC E
INC L
DJNZ PxH1
RET
NXLO LD HL,(X0)
LD DE,DSCR+#10C0
LD A,11
ADD A,H
LD H,A
JR Nx_
NXHI LD HL,(X0)
LD DE,DSCR
Nx_ CALL GMAP
LD B,12
NxH1 LD A,(HL)
RLA
JR NC,NxHN
PUSH BC
PUSH HL ;adr in map
PUSH DE ;adr in scr
LD HL,shadwA
if EGA==0 ;TODO
CALL SQROUT
endif
POP DE
POP HL
POP BC
NxHN INC E
INC E
INC L
DJNZ NxH1
RET
PYRT LD HL,(X0)
LD DE,DSCR+22
LD A,L
ADD A,11
LD L,A
JR Py_
PYLF LD HL,(X0)
LD DE,DSCR
Py_ CALL GMAP
LD B,12
Py1 PUSH BC
PUSH HL ;adr in map
PUSH DE ;adr in scr
CALL GSADR
if EGA==0 ;TODO
CALL NC,SQROUT
endif
POP DE
POP HL
POP BC
LD A,E
ADD A,64
LD E,A
JR NC,Py2
LD A,D
ADD A,8
LD D,A
Py2 LD A,L
ADD A,64
JR NC,Py3
INC H
Py3 LD L,A
DJNZ Py1
RET
NYRT LD HL,(X0)
LD DE,DSCR+22
LD A,L
ADD A,11
LD L,A
JR Ny_
NYLF LD HL,(X0)
LD DE,DSCR
Ny_ CALL GMAP
LD B,12
Ny1 LD A,(HL)
RLA
JR NC,NyN
PUSH BC
PUSH HL ;adr in map
PUSH DE ;adr in scr
LD HL,shadwA
if EGA==0 ;TODO
CALL SQROUT
endif
POP DE
POP HL
POP BC
NyN LD A,E
ADD A,64
LD E,A
JR NC,Ny2
LD A,D
ADD A,8
LD D,A
Ny2 LD A,L
ADD A,64
JR NC,Ny3
INC H
Ny3 LD L,A
DJNZ Ny1
RET
;------------------
GMAP ; вхHL-XY, выхHL-pos in map
LD A,L
RLCA
RLCA
SRL H
RRA
SRL H
RRA
LD L,A
LD A,H
ADD A,MAP/256
LD H,A
RET
GMAP2 ; вхHL-XY, выхHL-pos in map2
LD A,L
RLCA
RLCA
SRL H
RRA
SRL H
RRA
LD L,A
LD A,H
ADD A,MAP2/256
LD H,A
RET
shadwS ;выбор адр невидим поля
LD A,(shadwT)
shadwS_3
;тут тоже точка входа (+3)
PUSH AF
CALL MEM1
POP AF
OR A
LD DE,shadwA
JR Z,sha0
LD HL,SHADOW
LD BC,32
LDIR
RET
sha0 LD A,#FF
LD B,32
sha1 LD (DE),A
INC DE
DJNZ sha1
RET
GSADR ;вхHL-pos in map; выхHL-adr in LAND ;NC/C-видим,не видим
if EGA
LD A,(HL)
SLA A
RET C
;тайл=128 байт, всего 384 тайла (3 страницы)
CP 226
JR NC,GSA2
GSA0
;pg26,27
rrca
LD h,a
ld l,0
rla
ld a,l;0
adc a,26 ;NC
scf
rr h
rr l ;NC
set 6,h
jp _128
GSA2 CP 240
JR NC,GSA3
EX AF,AF' ;вода
LD A,(ANIM)
OR A
JR Z,GSA2A
GSA2C DEC A
JR Z,GSA2B
EX AF,AF'
ADD A,10
EX AF,AF'
JR GSA2C
GSA2B EX AF,AF'
JR GSA0
GSA2A EX AF,AF'
SUB 226-112
JR GSA0
GSAT DEFW 1,65,64,63,-1,-65,-64,-63 ;смещение на карте до центра здания
GSA3
RRCA ;120..127 - кайма зданий
SUB 120
;a=0..7
PUSH DE
PUSH AF ;0..7 номер места около домика
PUSH HL ;здания
LD HL,GSAT
CALL WT ;a=(hl+a)
POP DE
ADD HL,DE
LD A,(HL) ;нашли на карте центр здания = 78..127
AND #7F
CP 108
JR NC,GSA3A ;>=108: домик 2x2
;домик 3x3
SUB 78
ADD A,A
ADD A,A
ADD A,A
POP DE
ADD A,D ;0..7 номер места около домика
JR GSA11
GSA3A
;>=108: домик 2x2
SUB 108
LD E,A
ADD A,A
ADD A,E
POP DE
ADD A,D ;0..7 номер места около домика
add a,368-128
GSA11
;pg27,28
POP DE
LD h,a
ld l,0
rla
ld a,l;0
adc a,27 ;NC
scf
rr h
rr l ;NC
set 6,h
jp _128
else ;~EGA
LD A,(HL)
SLA A
RET C
CP 226
JR NC,GSA2
GSA0 LD L,A
LD H,LAND/4096
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
RET
GSA2 CP 240
JR NC,GSA3
EX AF,AF ;вода
LD A,(ANIM)
OR A
JR Z,GSA2A
GSA2C DEC A
JR Z,GSA2B
EX AF,AF
ADD A,10
EX AF,AF
JR GSA2C
GSA2B EX AF,AF
JR GSA0
GSA2A EX AF,AF
SUB 226-112
JR GSA0
GSAT DEFW 1,65,64,63,-1,-65,-64,-63
GSA3 RRCA
SUB 120
PUSH DE
PUSH AF
PUSH HL ;здания
LD HL,GSAT
CALL WT
POP DE
ADD HL,DE
LD A,(HL)
AND #7F
CP 108
JR NC,GSA3A
SUB 78
ADD A,A
ADD A,A
ADD A,A
POP DE
ADD A,D
LD DE,128*32+LAND
JR GSA11
GSA3A SUB 108
LD E,A
ADD A,A
ADD A,E
POP DE
ADD A,D
LD DE,368*32+LAND
GSA11 LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,DE
POP DE
RET
endif ;~EGA
ScorrP LD A,L
ADD A,32
LD L,A
JR C,Sco1
LD A,H
SUB 8
LD H,A
Sco1 LD A,E
ADD A,32
LD E,A
RET C
LD A,D
SUB 8
LD D,A
RET
ScorrM LD A,L
SUB 32
LD L,A
JR C,Sco3
LD A,H
ADD A,8
LD H,A
Sco3 LD A,E
SUB 32
LD E,A
RET C
LD A,D
ADD A,8
LD D,A
RET
;---------------
SdUR CALL ScU1
JP Z,ScRT
CALL ScR1
JP Z,ScUP1
CALL SW_OFF
if EGA
call O12X12
else
;--CALL ScU2+ScR2
CALL PXLO
CALL PYLF
CALL SXLO
CALL SYLF
CALL NXLO
CALL NYLF
CALL MEM7
CALL ScUR_
endif
JP ScNZ
SdDL CALL ScD1
JP Z,ScLF
CALL ScL1
JR Z,ScDW1
CALL SW_OFF
if EGA
call O12X12
else
;--CALL ScD2+ScL2
CALL PXHI
CALL PYRT
CALL SXHI
CALL SYRT
CALL NXHI
CALL NYRT
CALL MEM7
CALL ScDL_
endif
JP ScNZ
SdUL CALL ScU1
JP Z,ScLF
CALL ScL1
JR Z,ScUP1
CALL SW_OFF
if EGA
call O12X12
else
;--CALL ScU2+ScL2
CALL PXLO
CALL PYRT
CALL SXLO
CALL SYRT
CALL NXLO
CALL NYRT
CALL MEM7
CALL ScUL_
endif
JR ScNZ
SdDR CALL ScD1
JP Z,ScRT
CALL ScR1
JR Z,ScDW1
CALL SW_OFF
if EGA
call O12X12
else
;--CALL ScD2+ScR2
CALL PXHI
CALL PYLF
CALL SXHI
CALL SYLF
CALL NXHI
CALL NYLF
CALL MEM7
CALL ScDR_
endif
JR ScNZ
ScDW CALL ScD1
JP Z,noROT
ScDW1 CALL SW_OFF
if EGA
call O12X12
else
CALL ScD2
CALL MEM7
JP ScD_
ScD2 CALL PXHI
CALL SXHI
CALL NXHI
endif
JR ScNZ
ScD1 LD HL,Y0
LD A,(HL)
OR A
RET Z
DEC (HL)
OR A
RET
ScUP CALL ScU1
JP Z,noROT
ScUP1 CALL SW_OFF
if EGA
call O12X12
else
CALL ScU2
CALL MEM7
JP ScU_
ScU2 CALL PXLO
CALL SXLO
CALL NXLO
endif
ScNZ CALL BMOV
LD HL,isROT
LD (HL),1
RET
ScU1 LD HL,Y0
LD A,(HL)
CP 52
RET Z
INC (HL)
RET
ScLF CALL ScL1
JP Z,noROT
CALL SW_OFF
if EGA
call O12X12
else
CALL ScL2
CALL MEM7
JP ScL_
ScL2 CALL PYRT
CALL SYRT
CALL NYRT
endif
JR ScNZ
ScL1 LD HL,X0
LD A,(HL)
CP 52
RET Z
INC (HL)
RET
ScRT CALL ScR1
JP Z,noROT
CALL SW_OFF
if EGA
call O12X12
else
CALL ScR2
CALL MEM7
JP ScR_
ScR2 CALL PYLF
CALL SYLF
CALL NYLF
endif
JR ScNZ
ScR1 LD HL,X0
LD A,(HL)
OR A
RET Z
DEC (HL)
OR A
RET
if EGA==0
ScD_ CALL B_SETI
LD HL,SCR+#17A0
LD DE,SCR+#17E0
LD BC,#1602
ScD0 PUSH BC
CALL B_NXTI
LD A,8
ScD10 PUSH HL
PUSH DE
LDI;
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI;
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI;
LDI
LDI
LDI
LDI
LDI
LDI
LDI
POP DE
POP HL
DEC H
DEC D
DEC A
JP NZ,ScD10
CALL ScorrM
CALL BL_ONN
POP BC
DJNZ ScD0
DEC C
JP Z,B_U2B
LD L,E
LD A,D
XOR #60 ;!
LD H,A
LD B,2
JR ScD0
ScDR_ CALL B_SETI
LD HL,SCR+#17A0+21
LD DE,SCR+#17E0+23
LD BC,#1602
ScDR0 PUSH BC
CALL B_NXTI
LD A,8
ScDR1 EX AF,AF
PUSH HL
PUSH DE
LD BC,22
LDDR
LD L,E
LD A,D
XOR #60;!
LD H,A
LDD
LDD
POP DE
POP HL
DEC H
DEC D
EX AF,AF
DEC A
JP NZ,ScDR1
CALL ScorrM
CALL BL_ONN
POP BC
DJNZ ScDR0
DEC C
JP Z,B_U2B
LD L,E
LD A,D
XOR #60
LD H,A
LD B,2
JR ScDR0
ScDL_ CALL B_SETI
LD HL,SCR+#17A0+2
LD DE,SCR+#17E0
LD BC,#1602
ScDL0 PUSH BC
CALL B_NXTI
LD A,8
ScDL1 EX AF,AF
PUSH HL
PUSH DE
LD BC,22
LDIR
LD L,E
LD A,D
XOR #60;!
LD H,A
LDI
LDI
POP DE
POP HL
DEC H
DEC D
EX AF,AF
DEC A
JP NZ,ScDL1
CALL ScorrM
CALL BL_ONN
POP BC
DJNZ ScDL0
DEC C
JP Z,B_U2B
LD L,E
LD A,D
XOR #60
LD H,A
LD B,2
JR ScDL0
ScU_ CALL B_SETN
LD HL,SCR+#0040
LD DE,SCR
LD BC,#1602
ScU0 PUSH BC
CALL B_NXTN
LD A,8
ScU10 PUSH HL
PUSH DE
LDI;
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI;
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI;
LDI
LDI
LDI
LDI
LDI
LDI
LDI
POP DE
POP HL
INC H
INC D
DEC A
JP NZ,ScU10
CALL ScorrP
CALL BL_ONN
POP BC
DJNZ ScU0
DEC C
JP Z,B_U2B
LD L,E
LD A,D
XOR #60;!
LD H,A
LD B,2
JR ScU0
ScUR_ CALL B_SETN
LD HL,SCR+#0040+21
LD DE,SCR+23
LD BC,#1602
ScUR0 PUSH BC
CALL B_NXTN
LD A,8
ScUR1 EX AF,AF
PUSH HL
PUSH DE
LD BC,22
LDDR
LD L,E
LD A,D
XOR #60;!
LD H,A
LDD
LDD
POP DE
POP HL
INC H
INC D
EX AF,AF
DEC A
JP NZ,ScUR1
CALL ScorrP
CALL BL_ONN
POP BC
DJNZ ScUR0
DEC C
JP Z,B_U2B
LD L,E
LD A,D
XOR #60;!
LD H,A
LD B,2
JR ScUR0
ScUL_ CALL B_SETN
LD HL,SCR+#0040+2
LD DE,SCR
LD BC,#1602
ScUL0 PUSH BC
CALL B_NXTN
LD A,8
ScUL1 EX AF,AF
PUSH HL
PUSH DE
LD BC,22
LDIR
LD L,E
LD A,D
XOR #60;!
LD H,A
LDI
LDI
POP DE
POP HL
INC H
INC D
EX AF,AF
DEC A
JP NZ,ScUL1
CALL ScorrP
CALL BL_ONN
POP BC
DJNZ ScUL0
DEC C
JP Z,B_U2B
LD L,E
LD A,D
XOR #60;!
LD H,A
LD B,2
JR ScUL0
ScL_ CALL B_SET0
LD HL,SCR+2
LD DE,SCR
LD B,24
ScL00 PUSH BC
CALL B_NXT0
LD A,8
ScL0 EX AF,AF
PUSH HL
PUSH DE
LDI;
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI;
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI;
LDI
LDI
LDI
LDI
LDI
LD L,E
LD A,D
XOR #60;!
LD H,A
LDI
LDI
POP DE
POP HL
INC H
INC D
EX AF,AF
DEC A
JR NZ,ScL0
CALL ScorrP
CALL BL_ONN
POP BC
DJNZ ScL00
JP B_U2B
ScR_ CALL B_SET0
LD HL,SCR+21
LD DE,SCR+23
LD B,24
ScR00 PUSH BC
CALL B_NXT0
LD A,8
ScR0 EX AF,AF
PUSH HL
PUSH DE
LDD;
LDD
LDD
LDD
LDD
LDD
LDD
LDD
LDD;
LDD
LDD
LDD
LDD
LDD
LDD
LDD
LDD;
LDD
LDD
LDD
LDD
LDD
LD L,E
LD A,D
XOR #60;!
LD H,A
LDD
LDD
POP DE
POP HL
INC H
INC D
EX AF,AF
DEC A
JR NZ,ScR0
CALL ScorrP
CALL BL_ONN
POP BC
DJNZ ScR00
JP B_U2B
endif ;~EGA
ROTsub DEFW ScLF,ScRT,000,ScUP,SdUL,SdUR,000,ScDW,SdDL,SdDR
ROTATE LD A,(BENTER)
OR A
JR Z,rotCOR
ROt1 LD A,(CONTRB)
AND %1111
JR ROt2
rotCOR LD C,0
LD HL,(MX)
LD A,L
OR A
JR NZ,rC1
SET 1,C
rC1 CP 248
JR C,rC2
SET 0,C
rC2 LD A,H
OR A
JR NZ,rC3
SET 3,C
rC3 CP 184
JR C,rC5
SET 2,C
rC5 LD A,(PMOUSE)
OR A
LD A,C
JR NZ,ROt2
LD A,(CONTRB)
AND C
ROt2 OR A
JR Z,noRO1
CP %1011
JR NC,noRO1
LD HL,ROTsub-2
CALL WT
LD A,L
OR H
JR Z,noRO1
PUSH HL
LD A,(isROT)
OR A
JR NZ,RO_ON
INC A
LD (isSWFF),A
JR RO_1
RO_ON HALT
RO_1 CALL MEM1
POP HL
JP (HL)
noRO1 LD A,(isROT)
OR A
RET Z
noROT CALL MEM7
CALL B_OFF
if EGA==0
LD A,(isSWFF)
OR A
JR NZ,noRO2
CALL V_GET1
CALL V_GET2 ;get gfx under cursor before draw ;на рисуемом экране
;if EGA
;CALL V_MRK2 ;на рисуемом экране
;;CALL BLITER ;иначе показывает другой экран
;endif
noRO2
endif
XOR A
LD (V_FLAG),A ;cursor on
LD (isROT),A
RET
SW_OFF
;before scroll
LD A,(isSWFF)
OR A
RET Z
XOR A
LD (isSWFF),A
LD A,2
LD (V_FLAG),A ;cursor off
CALL MEM7
;if EGA==0
CALL V_PUT1
;endif
CALL V_PUT2 ;restore gfx under cursor ;на рисуемом экране
if EGA ;копируем экран
call copyscreen
endif
JP MEM1
FRAME ;выв игр оформл
if EGA
ret
else
;jr $
CALL MEM7
CALL STS ;выбор основного экрана (не теневого)
;bar-color
ATRs #18,#208,#50
ATRs #19,#106,#70
ATRs #218,#208,#50
ATRs #219,#104,#60
LD L,#70
LD H,L
LD (ATR+93),HL
ATRs #418,#508,#38
ATRs #41D,#401,#58
ATRs #41E,#401,#68
;меню-батт
ATRs #1418,#408,#68
;land-color
LD A,(COLOR)
AND %00111000
CP #28
LD A,#68
JR NZ,FRA_Ls
LD A,#58
FRA_Ls LD (COLRsc),A
FRA_L LD A,(isCOLR)
OR A
JR Z,FRA2
LD A,(MASTER)
OR A
LD A,#30
JR Z,FRA1
LD A,#28
FRA1 LD (MCOLOR),A
LD A,(COLOR)
JR FRA_L1
FRA2 LD A,#38
LD (MCOLOR),A
LD A,#30
FRA_L1 PUSH AF
LD E,A
LD HL,0
LD BC,#118
CALL STS ;выбор основного экрана (не теневого)
CALL ATRBAR
LD HL,#017
LD BC,#1801
CALL ATRBAR
POP AF
OR #40
LD E,A
LD HL,#100
LD BC,#1717
CALL ATRBAR
LD A,(MCOLOR)
LD E,A
LD HL,#918
LD BC,#B08
CALL ATRBAR
LD A,#20
LD (ATR+632),A
LD (ATR+639),A
RET
endif
typMAP ;определить тип карты (обычн/подземн -> LEV_T=0/1)
LD HL,MAP
LD A,(HL)
OR A
PUSH AF
JR Z,iTM0
;уровень - подземелье (без зданий, если [MAP+0]==1)
XOR A
LD (HL),A
INC A ;A=1
LD L,99 ;длина осмотра в подземельях
LD E,2 ;макс число трассировок
LD C,12 ;число ударов по дверям
JR iTMm
iTM0 XOR A ;A=0
LD L,64 ;длина осмотра в обычн уровнях
LD E,5
LD C,60 ;число ударов по лесу
iTMm LD (LEV_T),A
LD A,L
LD (MAXLEN),A
LD A,E
LD (MAXTRY),A
LD A,C
LD (BrWOOD),A
POP AF
RET
OUMAIN ;выв карты/поля
LD A,(isMAP)
OR A
JR Z,OU_SCR
OU_MAP ;режим-карта
LD HL,delMAP
LD A,(HL)
OR A
JR Z,oum1
DEC (HL)
RET
oum1 LD (HL),oumDEL ;велич, задержки
CALL MEM6
if EGA
;заблокировать стрелочку только на рисуемом экране, т.е. вообще не блокировать
;выключить стрелочку
;стереть стрелочку
;LD A,2
;LD (V_FLAG),A
CALL V_PUT2 ;на рисуемом экране
endif
CALL MP_OUT ;6
if EGA
;прочитать стрелочку
;включить стрелочку
CALL V_GET_MRK2 ;на рисуемом экране
;xor a
;LD (V_FLAG),A
endif
CALL BLITER ;7
LD HL,G_MAP1
LD (G_IMG),HL
RET
OU_SCR ;режим-экран
LD BC,#FDFE ;'F'-fast
IN A,(C)
AND %1000
JR NZ,OU_S1
LD HL,fram
INC (HL)
LD A,(HL)
CP ouFAST
RET C
LD (HL),0
OU_S1
CALL O12X12
LD A,(begBOX)
OR A
RET NZ
OU_RT CALL ROTATE
LD A,(isROT)
OR A
JR NZ,OU_RT
RET Z
O12X12
if EGA
;заблокировать стрелочку только на рисуемом экране, т.е. вообще не блокировать
;выключить стрелочку
;стереть стрелочку
;ld a,(curscrnum)
;push af
;LD A,2
;LD (V_FLAG),A ;не помогает
CALL V_PUT2 ;на рисуемом экране
endif
if EGA==0
CALL MEM7
CALL M_PLAT ;7 ;показать площадку под стр-во
endif
CALL MEM1
CALL P12X12 ;1
CALL S12X12 ;m
CALL N12X12 ;1
if EGA
CALL MEM7
CALL M_PLAT ;7 ;показать площадку под стр-во
endif
CALL MEM4
CALL outBOX ;4
CALL MEM0
CALL flpSEL ;0 ;flip пометки селект
CALL HiENER ;0[**] ;супер энергия
if EGA
;прочитать стрелочку
;включить стрелочку
CALL V_GET_MRK2 ;на рисуемом экране
;xor a
;LD (V_FLAG),A
;ld a,(curscrnum)
;pop bc
;cp b
;jr nz,$ ;не бывает
endif
CALL BLITER ;7
LD HL,G_IMG1
LD (G_IMG),HL
if EGA
call SLOWER ;TODO не 5 фреймов, а 3?
jp MEM7
else
RET
endif
MAPon XOR A
LD (delMAP),A
CALL MP_OFF ;очистка
CALL BLITER
if EGA==0
LD A,(COLOR)
XOR %01011001
CALL FRA_L1
else
call MAPoffclbuttons ;иначе затираются кнопки
;call OUTBAR
endif
CALL OU_MAP
CALL MAPwin
LD (isMAP),A
RET
MAPoff XOR A
LD (isMAP),A
CALL O12X12
if EGA
MAPoffclbuttons
;иначе затираются кнопки
LD HL,_BUT_H
LD B,7
MAPoncBU1i LD (HL),#FF
INC HL
DJNZ MAPoncBU1i
ret
else
JP FRA_L
endif
MAPwin ;выв окна видимости
CALL STS
LD DE,(X0)
LD A,E
ADD A,E
ADD A,E
RRCA
RRCA
RRCA
AND %11111
LD L,A
LD A,D
ADD A,D
ADD A,D
RRCA
RRCA
RRCA
AND %11111
LD H,A
CALL ACOORD
LD DE,27
LD C,5
mwi0 LD B,5
mwi1 LD A,(HL)
XOR %00011001
LD (HL),A
INC L
DJNZ mwi1
ADD HL,DE
DEC C
JR NZ,mwi0
RET
movWIN ;перемещ окна в карте по enter (BC-центр окна)
LD A,C
CALL iW
LD L,A
LD A,B
CALL iW
LD H,A
LD (X0),HL
RET
iW SUB 5
JR NC,iW1
XOR A
iW1 CP 52
RET C
LD A,51
RET
if EGA==0
MP_OFF CALL MP_OF1 ;очистка map в DSCR
LD (DSCR),HL
RET
MP_OF1 LD HL,#FFFF
LD (SET_SP+1),SP
LD SP,DSCR+#1800-6
LD B,236
mp09 DEFS 13,#E5;PUSH HL
DJNZ mp09
JP SET_SP
endif
MANUAL ;обработка управляющ воздейств
CALL BMOV
;H-вкл паузу
LD BC,#BFFE
IN A,(C)
AND %10000
JR NZ,maz0
LD (onPAUS),A
CPL
JR mau0ht
maz0 ;Z-вкл/выкл карту
LD A,(BENTER)
OR A
JR NZ,mau4
LD B,#FE
IN A,(C)
AND %111
CP %101
LD A,(Z_LOCK)
JR NZ,mau2
OR A
JR NZ,mau1
if EGA
ld e,0
OS_SETSCREEN
ld e,0
OS_CLS
ld e,1
OS_SETSCREEN
ld e,0
OS_CLS
call putBAR
endif
mau0 LD A,(isMAP)
mau0ht OR A
PUSH AF
CALL Z,MAPon
POP AF
CALL NZ,MAPoff
LD A,1
JR mau1
mau2 XOR A
mau1 LD (Z_LOCK),A
mau4 ;нажатый FIRE (0-none,1-space,2-caps)
LD A,(CONTRB)
BIT 4,A
JR NZ,maf1
AND %100000
JR NZ,maf2
LD BC,#FEFE
IN A,(C)
AND %1111
CP %1110
JR Z,maf2
XOR A
JR maf0
maf1 LD A,1
JR maf0
maf2 LD A,(BX)
CP 24
JR C,maf2_
LD A,(begBOX)
OR A
JR Z,maf1;CAP->SPACE
maf2_ LD A,2
maf0 LD (T_FIRE),A ;(0-none,1-space,2-caps)
CP 1
RET Z
XOR A
LD (fixTAR),A ;расфиксировать цель
RET
SEEonn ;подключить onsee/onsee2
LD A,#C3 ;код jp
JR SEExx
SEEoff ;отключть их
LD A,#C9 ;код ret
SEExx LD (ONSEE),A
LD (ONSEE2),A
RET
;-----------для работы с меню
gmMENU CALL MEM7
XOR A
LD (isMAP),A
CALL M_MENU
CALL aSETUP
JP MEM0
MU_BOX ;бох меню DE-coord,bc-размер
PUSH HL
DEC B
DEC B
LD H,B
DEC C
DEC C
LD L,E
LD A,99
CALL PRINT
meb1 LD A,100
CALL PRINT
DJNZ meb1
LD A,101
CALL PRINT
meb2 LD B,H
LD E,L
INC D
LD A,103
CALL PRINT
meb4 LD A,10
CALL PRINT
DJNZ meb4
LD A,104
CALL PRINT
DEC C
JR NZ,meb2
LD B,H
LD E,L
INC D
LD A,105
CALL PRINT
meb5 LD A,106
CALL PRINT
DJNZ meb5
LD A,107
CALL PRINT
POP HL
RET
_oSani ;анимация для Setup (A->DE)
_oSA1 EX AF,AF
CALL MEM1
EX AF,AF
CALL GSADR+1
if EGA==0 ;TODO
CALL SQROUT
endif
JP MEM7
_shdw ;уст темноты
CALL shadwS_3
JP MEM7
aSETUP ;исполнение установок
CALL TMOM ;7
CALL shadwS ;--1
CALL ANIset ;1
LD A,(MUSONF)
OR A
JR NZ,aSS1
CALL MEM6 ;--6
CALL WMUSIC ;6
CALL MEM0
aSS1 JP MAPoff
UP_TIM ;повыш уровня врага (через TIME=0:40-N)
LD HL,kARC
LD B,4
upTT0 LD A,(HL)
CP 2
JR NC,upTT1
INC (HL)
upTT1 INC HL
DJNZ upTT0
;
UP_DIF ;повыш сложность (DIFFIC=1)
LD HL,levMAX ;+1
INC (HL)
LD HL,lev1ST ;3/4
CALL uppd34
LD HL,levDEL ;3/4
uppd34 SRL (HL)
LD A,(HL)
SRL (HL)
ADD A,(HL)
LD (HL),A
RET
PAUSE ;пауза с выводом задания по "H"
LD HL,onPAUS
LD A,(HL)
OR A
RET NZ
INC (HL)
if EGA
;выключить стрелочку
;стереть стрелочку
LD A,2
LD (V_FLAG),A
CALL V_PUT1 ;на видимом экране
endif
LD DE,#301
LD BC,#1612
CALL MU_BOX
;параметры
LD DE,#503
PUSH DE ;N ур
LD HL,TU_1
CALL tuPR
LD A,(MASTER)
OR A
LD HL,TU_7
JR Z,tu2
LD HL,TU_8
tu2 CALL PRINTS
LD A,(LEVEL)
CP 10
JR C,tu3
SUB 10
PUSH AF
LD A,1
CALL PRINT
POP AF
tu3 CALL PRINT
POP DE
INC D
INC D
PUSH DE ;сложн
LD HL,TU_2
CALL tuPR
LD A,(DIFFIC)
OR A
LD HL,TU_5
JR Z,tu1
LD HL,TU_6
tu1 CALL PRINTS
POP DE
INC D
INC D
CALL TUtime
INC D
INC D
INC D
PUSH DE
LD E,8
LD HL,TU_9
CALL PRINTS
POP DE
INC D
INC D
DEC E
;задание
LD B,3
LD HL,TASK_M
aus1 PUSH DE
PUSH BC
CALL PRINTS
POP BC
POP DE
INC HL
INC D
DJNZ aus1
if EGA
;прочитать стрелочку
;включить стрелочку
CALL V_GET1
call V_MRK1 ;на видимом экране
xor a
LD (V_FLAG),A
else
CALL BLITER ;иначе показывает другой экран
endif
CALL bWAIT
JP TMOM
TUarr DEFB 10,109,10,127 ;_>_
TU_1 DEFB 31,64,62,50,53,61,74,127 ;Уровень
TU_2 DEFB 29,59,62,54,61,62,65,66,74,127 ;Cложность
TU_3 DEFB 14,64,53,60,79,127 ;Время
TU_4 DEFB 26,49,73,53,53,127 ;Общее
TU_5 DEFB 81,26,82,24,127; NORM
TU_6 DEFB 25,84,110,25,127; HiGH
TU_7 DEFB 23,78,52,56,91,127;Люди-
TU_8 DEFB 22,67,61,51,56,91,127;Кунги-
TU_9 DEFB 19,48,52,48,61,56,53,43,127;Задание:
TUtime ;выв.времени ур-ня/игры
PUSH DE ;вр ур
LD HL,TU_3
CALL tuPR
LD HL,LEVRES
CALL PRINTS
POP DE
INC D
INC D
PUSH DE ;общ вр
LD HL,TU_4
CALL tuPR
LD HL,RESULT
CALL PRINTS
POP DE
RET
tuPR CALL PRINTS
LD HL,TUarr
JP PRINTS
Evic1 DEFB 27,26,13,17,16,12,47, 127 ;ПОБЕДА!
Evic2 DEFB 19,48,52,48,61,56,53, 10, 50,75,63,62,59,61,53,61,62,47, 127
Emis1 DEFB 14,75,10,63,62,66,53,64,63,53,59,56, 127
Emis2 DEFB 63,62,64,48,54,53,61,56,53,47, 127
Emis3 DEFB 27,62,63,75,66,48,57,66,53,65,74, 10, 53,73,80, 127 ;try again
Ey_n DEFB 87,86,90,81,88,44, 127
bHmine EQU 255 ;здоровье шахты
bHEALT ;здоровье зданий
DEFB 200,160,132,130,150,140,160,250,80
DEFB 0
DEFB 200,160,132,130,150,140,160,250,80
OFFSEE ;выкл видим
LD HL,MAP+65
LD C,62
fE1 LD B,62
fE0 SET 7,(HL)
INC HL
DJNZ fE0
INC HL
INC HL
DEC C
JR NZ,fE1
RET
ANIMTR LD HL,ANIM
INC (HL)
LD A,(HL)
CP 4
RET C
XOR A
LD (HL),A
RET
go_Max EQU 52 ;номер макс прох поля
setMAP LD HL,MAP2 ;заполнение мап2
LD DE,MAP
LD C,64
tE1 LD B,64
tE0 LD A,(DE)
OR A
JR Z,tE2
CP go_Max
LD A,0
JR C,tE3
INC A
tE2 INC A
tE3 LD (HL),A
INC DE
INC HL
DJNZ tE0
DEC C
JR NZ,tE1
RET
;------часто используемые п/п------
IX0_HL LD (IX),L
LD (IX+1),H
RET
HL_IX0 LD L,(IX)
LD H,(IX+1)
RET
IXt_HL LD (IX+10),L
LD (IX+11),H
RET
HL_IXt LD L,(IX+10)
LD H,(IX+11)
RET
IX_98 XOR A ;стой
LD (IX+9),A
LD (IX+8),A
RET
IX_92 LD (IX+9),2
JR IX_93a
IX_93 LD (IX+9),3 ;иди
IX_93a LD (IX+8),#80
RET
IMPIX3 LD A,%11000000
LD (IX+3),A
JP HERMOV
loop_K LD B,48
loopKb LD IX,KUNGE
LD DE,16
RET
loop_H LD B,48
loopHb LD IX,HUMAN
LD DE,16
RET
DIST2 ;расст по ф-ле: max(|L-ix0|,|H-ix1|) Вх.XY-HL;Вых.A
LD A,L
SUB (IX+0)
JR NC,d2t1
NEG
d2t1 LD B,A
LD A,H
SUB (IX+1)
JR NC,d2t2
NEG
d2t2 CP B
RET NC
LD A,B
RET
;------------
isEND LD A,(TheEND)
OR A
JP NZ,MU_EN_
;
LD A,(LEV_T)
OR A
CALL NZ,isEND2
LD A,(TIC)
AND %11111
CP 5
RET NZ
CALL isEND1
LD (END_1),A
RET
MU_EN_ ;[--14]
if 1==0
PUSH AF
LD HL,WX_LEN+82
LD A,(WX_BAD+14)
CP (HL)
JR NZ,isEND1 ;err
POP AF
endif
JP MU_END
isEND1 ;проверка окончания боя (Z/NZ-ok/конец (A=1/2-победа наших/врагов)
LD HL,KUNGE
LD B,48+6
LD DE,16
iee0 LD A,(HL)
OR A
JR NZ,iee2
ADD HL,DE
DJNZ iee0
LD HL,KBUILD
LD E,8
LD B,#20
iee1 LD A,(HL)
OR A
JR NZ,iee2
ADD HL,DE
DJNZ iee1
XOR A
INC A
RET NZ;1
iee2 LD HL,HUMAN
LD E,16
LD B,48
iee20 LD A,(HL)
OR A
JR NZ,iee3
ADD HL,DE
DJNZ iee20
LD HL,HBUILD
LD E,8
LD B,#20
iee21 LD A,(HL)
OR A
JR NZ,iee3
ADD HL,DE
DJNZ iee21
XOR A
INC A
INC A
RET NZ;2
iee3 XOR A
RET Z;0
isEND2 CALL loop_H ;князь в туннеле
ien0 LD A,(IX+4)
CP 22
JR C,ien1
CP 24
JR NC,ien1
CALL HL_IX0
LD A,L
OR A
JR Z,ien1
CALL GMAP
LD A,(HL)
AND #7F
CP 5
JR NZ,ien1
LD A,1
LD (END_2),A
ien1 ADD IX,DE
DJNZ ien0
RET
;****** главн цикл *****
CONTgm
;загрузка отл игры
if 1==0
CALL INI_D2
endif
CALL LOD1st
SCF
CALL LOADms ;C=1
CALL shadwS ;--1
CALL MEM6 ;--6
CALL WMUSIC ;6
EI
JP ENTRY
LODrtr ;рестарт уровня
LD HL,LEVEL
DEC (HL)
LD HL,hCLRI_ ;восст осн врем/закл
LD DE,hCLRIC
LD BC,12
LDIR
LODnxt ;нов.уровень
LD A,2
LD (V_FLAG),A
if 1==0
CALL CHNGd2
endif
CALL MEM6
CALL WMUSIC
DI
JR LODn1
LODnew ;новая игра
if 1==0
CALL INI_D2
endif
CALL LOD1st ;6 i/o
;загрузка и иниц. данных ур-ня
LODn1 CALL LODlev
LD HL,hCLRIC ;копия осн врем/закл
LD DE,hCLRI_
LD BC,12
LDIR
XOR A
;jr $
CALL LOADms ;i/o;C=0
_start CALL shadwS ;--1
CALL ANIset ;1
CALL MEM0 ;--0
CALL typMAP ;0
CALL Z,iniBLT ;0
CALL setBLT ;0
CALL OFFSEE ;0
CALL vieBLT ;0
CALL MEM1 ;--1
CALL NEWALL ;1
CALL NEWenm ;1
CALL MEM0 ;--0
CALL pntINI ;0
CALL pcINI ;0lev
CALL MEM6 ;--6
CALL XY1st ;6
CALL peonN ;6 \
LD (peon_W),HL ; /
CALL WMUSIC ;6
CALL bWAIT ;0
XOR A
LD (TIC_UP),A
;
ENTRY ;общая точка входа для нов. игры и отгрузки
if EGA
ld e,0
OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
ld e,0
OS_SETSCREEN
ld e,0
OS_CLS
ld e,1
OS_SETSCREEN
ld e,0
OS_CLS ;там была 6912 картинка
call setpal
endif
XOR A
LD (isMAP),A
CALL putBAR ;--7
CALL MEM0 ;--0
CALL cBUini ;0
CALL FRAME ;--7
CALL EVENTr ;*
CALL OUMAIN ;7
NNN ;игровой цикл
CALL MANUAL ;7
CALL MEM6 ;---6
CALL TIMER ;6
CALL SLOWER ;6
CALL MEM6 ;---6
CALL RNDcrr ;6
CALL cTIC ;6
CALL dMAGIC ;6
CALL SPLIN ;6
CALL REpeon ;6
LD SP,STACK;#403E ;???
CALL MEM1 ;---1
CALL REMONT ;1
CALL MEM0 ;---0
CALL isRUN ;0
CALL ANIMTR ;0
CALL selTAR ;0
CALL ACTION ;0
CALL SHED_H ;0
CALL SEEoff ;0
CALL SHED_K ;0
CALL SHED_p ;0
CALL BULLER ;0
CALL hSCAN ;0
CALL kSCAN ;0
CALL SEEonn ;0
CALL MINER ;0
CALL HOMER ;0
CALL pntACT ;0
CALL COMPUT ;0
CALL pcLOOP ;0lev
CALL MEM7 ;--7
; LD BC,#FBFE ;чит - след уровень
; IN A,(C)
; AND %10000
; JR NZ,noHACK
; LD A,1
; LD (TheEND),A
noHACK ;
CALL isEND ;7
if 1==0 ;???
CALL _TST#6 ;7[**]
endif
CALL OUTBAR ;7
CALL OUMAIN ;7
CALL PAUSE ;7
CALL NNN ;!*
SYLF CALL vrYLF
CALL vXPUT
JR SxS
SYRT CALL vrYRT
CALL vXPUT
JR SxS
SXHI CALL vrXUP
CALL vXPUT
JR SxS
SXLO CALL vrXDW
CALL vXPUT
JR SxS
S12X12 CALL XY0pos
CALL vSORT
CALL vXPUT
SxS CALL vBULL
CALL vFLAME
JP MEM1
;wMAIN ;ОТЛАД
; CALL MEM0 ;0 отлад
; CALL SEEonn ;0 отлад
; CALL setC1 ;0 отлад
; CALL setMAP ;0 отлад
JP _start ;отладочн т.входа ;???
;---demo
wMAIN ;в этом порядке
DI
;;;;;;;;*F W_CRC
CALL MEM6
LD A,(#EEC9) ;портится прерываниями ;патч к музыке
PUSH AF
LD A,(#F221) ;портится прерываниями ;патч к музыке
PUSH AF
CALL DEMO
DI
CALL MEM6
POP AF
LD (#F221),A ;восст
POP AF
LD (#EEC9),A ;восст
;---start menu
CALL LDI123;!!>>
bWAIT CALL CONTR
LD A,(CONTRB)
AND %10000
JR Z,bWAIT
RET NZ
if EGA
jp putBAR
else
putBAR ;выв панели
CALL OFFS ;очистка экрана
LD DE,DSCR
LD HL,#0018
LD BC,#1808
JP PUTSYM
endif
if 1==0 ;???
_TST#6 LD A,(RNB) ;[**]mem7
AND %11101111
RET NZ
LD DE,#C900
TST#6 XOR A
LD HL,#4080
LD BC,#3500
JP tst60a
endif
ONSEE1 CALL MEM0 ;newall и onsee - в разн. страницах
CALL ONSEE
JP MEM1
;-----------------------------
;низ +
;трупы +
;воины по очереди +
;пули,взрывы,закл +
;дым пожарищ+
;невидим квадраты +
;курсор +