;**** HЛО-2. Дьяволы бездны ****
;8F80-xCONV(128)
;9000-теневой экран(6k)
;A800-теневые атрибуты(768) (128-буф1)
;AB00-MAN+ALIEN(1024)
;AF80-vSIZE(128)
;AF00-xATR(128)
;B000-истребитель(2k) (0,1,2-15)
;B800-НЛО(6k) (16-63)
;D000-ландшафт(4k) (64-95)
;E000-1й этаж(4k)
;F000-2й этаж(4k)
;CПРАЙТЫ: 0-fill 2й этаж;1-fill 1й этаж
;2-15-истребитель(2-vSIZE<4)
;96-127-стоит герой(0-31)
SCR EQU #C000
ATR EQU #D800
DSCR EQU #9000
if 0;EGA
else
DATR EQU #A800
endif
MAN EQU #AB00
ALIEN EQU MAN+320
TMP EQU DSCR
xATR EQU #AF00
vSIZE EQU #AF80
xCONV EQU #8F80
;****************************************** работа с 3D спрайтами
SH DEFB 0; Shift 0/8
TX DEFB 0
TY DEFB 1
TTX DEFB #CD
TTY DEFB 0
NSH DEFW 0 ;96,64,32,0, а после цикла -16 (для скролла вверх)
UDHL DEFW 6
XMAX DEFB 63;макс.коорд
YMAX DEFB 63
;*L+
B_DAT ;-----данные боя-------------
OLDFLR DEFB 0
X0 DEFB 63
Y0 DEFB 63
RNB DEFB 5
RNA DEFW 1970
NX_RNB DEFB 0
NX_RNA DEFW 505
FIRTYP DEFB 0 ;тип Стрельбы (1-прицельная)
HER_N DEFB 0 ;NO. текущ героя
HER_AD DEFW 0 ;адр. его данных
G_TIME DEFB 0 ;время использ текущ оружия
G_TYPE DEFB #FF;текущ оружие
SETLEN EQU 38
SET_N DEFB 0 ;к-во записей
SETDIM DEFS 5*SETLEN,#FF ;двери/гранаты (X,Y,Flr,Tmp,Door)/(x,y,Flr,0,0)
B_LEN EQU $-B_DAT ;--------------
HER_BA LD HL,(HER_AD) ;взять поле А
JP BA
RRT LD DE,DSCR+1024 ;скролл вправо
LD HL,DSCR+1024+1
LD BC,4095
LDIR
LD A,(SH)
XOR 8
LD (SH),A
JR NZ,RR8
LD HL,X0
INC (HL)
INC HL
DEC (HL)
RR8 LD A,(FLR)
OR A
JR NZ,RLN
INC A
CALL FLOOR
CALL RLN
XOR A
CALL FLOOR
RLN LD DE,(X0)
LD A,14
ADD A,E
LD E,A
LD A,-14
ADD A,D
LD D,A
LD A,(SH)
OR A
JR Z,RL0
LD HL,DSCR+29+128
JR LL1
RL0 DEC E
LD HL,DSCR+29
JR LL1
LRT LD DE,DSCR+6143-1024 ;Скролл влево
LD HL,DSCR+6142-1024
LD BC,4095
LDDR
LD A,(SH)
XOR 8
LD (SH),A
JR Z,LR8
LD HL,X0
DEC (HL)
INC HL
INC (HL)
LR8 LD A,(FLR)
OR A
JR NZ,LLN
INC A
CALL FLOOR
CALL LLN
XOR A
CALL FLOOR
LLN LD A,(SH)
LD DE,(X0)
OR A
JR NZ,LL0
LD HL,DSCR+128+2
JR LL1
LL0 LD HL,DSCR+2
DEC D
LL1 LD (TX),DE
LD B,20
LL2 CALL ASP
JR Z,LL_2
CALL LSP
LL_2 LD DE,128
ADD HL,DE
LD A,(TY)
INC A
LD (TY),A
CALL ASP
JR Z,LL_3
CALL RSP
LL_3 LD DE,128
ADD HL,DE
LD A,(TX)
INC A
LD (TX),A
DJNZ LL2
RET
DRT LD DE,DSCR+1024 ;скролл вниз
LD HL,DSCR+256+1024
LD BC,4096-256
LDIR
LD HL,X0
INC (HL)
INC HL
INC (HL)
LD A,(FLR)
OR A
JR NZ,DLN
INC A
CALL FLOOR
CALL DLN
XOR A
CALL FLOOR
DLN LD HL,X0
LD A,#F
ADD A,(HL)
LD (TTX),A
INC HL
LD A,#F
ADD A,(HL)
LD (TTY),A
LD HL,DSCR+4096+768+1
JR UL_
URT LD DE,DSCR+6143-1024 ;скролл вверх
LD HL,DSCR+6143-256-1024
LD BC,4096-256
LDDR
LD HL,X0
DEC (HL)
INC HL
DEC (HL)
LD A,(FLR)
OR A
JR NZ,ULN
INC A
CALL FLOOR
CALL ULN
XOR A
CALL FLOOR
ULN LD HL,(X0)
LD (TTX),HL
LD HL,DSCR+1024+1
UL_ LD A,(SH)
OR A
JR NZ,UL10
INC HL
UL10 LD (UDHL),HL
LD HL,96
LD (NSH),HL ;96,64,32,0, а после цикла -16
LD C,4
UL0 LD HL,(UDHL)
LD DE,(TTX)
LD (TX),DE
CALL UDL2
LD HL,(UDHL)
DEC HL
LD DE,(TTX)
INC D
LD (TX),DE
CALL UDL
LD HL,(NSH)
LD DE,32
OR A
SBC HL,DE
LD (NSH),HL
LD HL,(TTX)
INC H
INC L
LD (TTX),HL
DEC C
JR NZ,UL0
LD HL,-16
LD (NSH),HL
LD HL,(UDHL)
LD DE,128
ADD HL,DE
LD DE,(TTX)
LD (TX),DE
CALL UDL2
RET
UDL LD B,15
UD0 CALL ASP
JR Z,U_D0
CALL NSP
U_D0 LD DE,(TX)
DEC D
INC E
LD (TX),DE
INC HL
INC HL
DJNZ UD0
RET
UDL2 LD B,15
UD2 CALL ASP
JR Z,U_D2
CALL NSP2
U_D2 LD DE,(TX)
DEC D
INC E
LD (TX),DE
INC HL
INC HL
DJNZ UD2
RET
PSP ;задать N спр
EX AF,AF
CALL GSP
CP 2
RET C
EXX
EX AF,AF
LD (HL),A
EXX
RET
ATSP ;получить атрибуты из xATR
CALL GSP
AND #7F
ATSP_ EXX
ATSP_exx
LD E,A
LD D,xATR/256
LD A,(DE)
EXX
RET
ATSPM ;взять атрибуты с учётом героев
CALL GSP
AND #7F
CP #60
JR C,ATSP_
SUB #60
EXX
RLCA
RLCA
RLCA
LD D,0
SLA A
RL D
SLA A
RL D
ADD A,7
LD E,A
LD A,D
ADD A,MAN/256
LD D,A
LD A,(DE)
AND #7F
JR ATSP_exx
GS_4x4 LD A,63
CP H
DEFB #38,#14 ;JR C,G00
CP L
DEFB #38,#11 ;JR C,G00
LD A,L
RLCA
RLCA
SRL H
RRA
SRL H
RRA
LD L,A
GS_8x2 LD A,31
CP H
DEFB #38,#14 ;JR C,G00
LD A,127
CP L
DEFB #38,#0F ;JR C,G00
RLC L
SRL H
RR L
NOP
NOP
SET4x4 LD HL,#3F3F ;уст.поле 64х64
LD DE,GS_4x4
JR SETxxx
SET8x2 LD HL,#1F7F ;уст.поле 128х32
LD DE,GS_8x2
SETxxx LD (XMAX),HL
EX DE,HL
LD DE,GSPdim
LD BC,18
LDIR
RET
GSP EXX ;получить N спр
LD HL,(TX)
GSPdim LD A,63
CP H
JR C,G00
CP L
JR C,G00
LD A,L
RLCA
RLCA
SRL H
RRA
SRL H
RRA
LD L,A
GS1 LD A,#F0 ;map #F000/#E000
OR H
LD H,A
LD A,(HL)
EXX
RET
G00 LD A,1 ;Вне поля
EXX
RET
;AinvX- #AA(XOR D)-норм.,#0(NOP)-только маска
;возвр: Z-0й спрайт DE-адр А-номер
ASP CALL GSP
LD D,A
if EGA == 0
RLCA
LD A,(Ainv1)
JR C,A2P
OR A
JR NZ,A22P
LD A,#AA
JR A21P
A2P OR A
JR Z,A22P
XOR A
A21P LD (Ainv1),A
LD (Ainv2),A
LD (Ainv3),A
LD (Ainv4),A
A22P
LD A,D
endif
A22P_ LD E,0
AND #7F
PUSH AF
CP #60
JR NC,A4P
if EGA
ld a,d
add a,0xc0
ld d,a
ld a,13 ;pg
jr nc,MSizeP_retilen1
inc a
set 7,d
set 6,d
MSizeP_retilen1
call setpg
else
SRL A
RR E
ADD A,#B0;sprites
LD D,A
endif
POP AF
RET
A4P POP AF
SUB #60
PUSHs;$
PUSH IX
CALL GET_IX
CALL HERLIV
JR NZ,A7PLIV
LD A,(IX+4)
CALL M96
if EGA
add hl,hl
ld de,0xf000 ;TODO
else
LD DE,xDIE
endif
JR A6P
A7PLIV LD A,(IX+6) ;visi
OR A ;
LD A,(IX+7) ;
JR Z,A9P ;
POP IX
POPs;$
JR A22P_
A9P CALL NORM_V
LD A,(IX+3)
CALL M96
ADD HL,HL
LD A,(IX+4)
RLCA
LD D,A
RLCA
ADD A,D
ADD A,H
LD H,A
if EGA
add hl,hl
ld de,0x8400
else
LD DE,xHERO
endif
A6P ADD HL,DE
PUSH HL ;sprite gfx
LD A,(IX+7)
AND #7F
LD L,0
if EGA
add a,#c0
ld h,a
ld a,13
jr nc,$+2+1+4
inc a
set 7,h
set 6,h ;tile gfx
call setpg
LD DE,temptilebuf;DATR ;temporary tile buffer
LD BC,256
LDIR
pop de ;sprite gfx
ld a,8
bit 6,d
set 6,d
jr z,$+3
inc a
call setpg
LD bc,temptilebuf;DATR ;temporary tile buffer
;наложение спрайта на тайл
ld h,tmask/256
A5P_column
ld a,c
add a,8
ld c,a
dup 24
LD A,(de) ;sprite gfx
INC de
LD L,A
LD A,(bc) ;temporary tile buffer
AND (HL)
OR L
LD (bc),A
inc c
edup
jp nz,A5P_column
else
SRL A
RR L
ADD A,#B0 ;???тайлы корабля и далее прочие тайлы
LD H,A
LD DE,DATR
LD BC,128
LDIR
POP HL ;sprite gfx
LD DE,DATR+16
Ms 4
LD B,48
A5P LD A,(DE)
OR (HL)
LD (DE),A
INC DE
LD A,(DE)
CPL
OR (HL)
CPL
INC HL
OR (HL)
LD (DE),A
INC DE
INC HL
DJNZ A5P
endif
CALL PT128
POP IX
POPs;$
if EGA
ld de,temptilebuf
else
LD DE,DATR ;temporary tile buffer
endif
LD A,#60
OR A
RET;NZ
M96 LD L,A
RLCA
ADD A,L ;x3
RLCA ;x6
RLCA ;x12
LD L,A
LD H,0
ADD HL,HL ;x24
ADD HL,HL ;x48
ADD HL,HL ;x96
RET
;вывод 3D тайла (для полного обновления экрана ALLSPF)
MSizeP
;ld a,201
;ld (MSizeP),a
pushs;$
if EGA
;push bc
call PT128
;pop bc
endif
CALL ASP ;out: de=tile addr
JR Z,MSiRET
;jr $
if EGA == 0
PUSH HL
LD B,vSIZE/256
OR #80 ;(vSIZE mod 256)
LD C,A
LD A,(BC)
LD H,0
ADD A,A
ADD A,A
ADD A,A
LD L,A
RRCA
ADD A,E
LD E,A
ADD HL,HL
ADD HL,HL
LD A,(BC)
POP BC
ADD HL,BC
CPL
ADD A,33
LD B,A
else
if 0
ld a,d
sub 0xB0
sla e
rla
;sla e
;rla
add a,0xc0
ld d,a
ld a,13 ;pg
jr nc,MSizeP_retilen1
inc a
set 7,d
set 6,d
;ld a,d
;sub 0x40
;ld d,a
;ld a,14 ;pg
MSizeP_retilen1
;ld de,0xdf00
;ld a,13
call setpg
endif
push hl
pop bc
ld b,32
endif
JP MS2
BSP pushs;$
JP MS2
;для скролла вверх/вниз
NSP pushs;$
LD BC,(NSH) ;96,64,32,0, а после цикла -16
EX DE,HL
ADD HL,BC
EX DE,HL
LD B,8
JP MS2 ;печать полного тайла, но на высоту 8
;для скролла вверх/вниз
NSP2 pushs;$
EX DE,HL
LD BC,(NSH) ;96,64,32,0, а после цикла -16
ADD HL,BC
LD BC,16
ADD HL,BC ;переходим к нижней половине тайла?
EX DE,HL
LD B,4
LD A,(NSH) ;96,64,32,0, а после цикла -16
CP 96
JR Z,MS2 ;печать полного тайла, но на высоту 4
CP -16
JR Z,MS2 ;печать полного тайла, но на высоту 4
LD B,8
JP MS2 ;печать полного тайла, но на высоту 8
;печать полного тайла
MSP pushs;$
LD B,32
MS2
if EGA
ld hx,b ;hgt
call setpgsscr40008000
ld b,h
ld c,l ;bc=scr
push de
push bc
push ix
call prtile
pop ix
pop bc
pop de
set 7,e
inc bc
call prtile
call setpgsmain40008000
else
LD (MSPSP+1),SP
EX DE,HL
LD SP,HL
EX DE,HL
MS20 POP DE
LD A,(HL)
OR E
Ainv1 XOR D
LD (HL),A
INC HL
POP DE
LD A,(HL)
OR E
Ainv2 XOR D
LD (HL),A
LD DE,31
ADD HL,DE
DJNZ MS20
MSPSP LD SP,#4020
endif
MSiRET pops;$
RET
;печать левой части тайла
LSP pushs;$
LD B,32
LS2
if EGA
ld hx,b
call setpgsscr40008000
ld b,h
ld c,l
call prtile
call setpgsmain40008000
else
LD (LSPSP+1),SP
EX DE,HL
LD SP,HL
EX DE,HL
LS20 POP DE
LD A,(HL)
OR E
Ainv3 XOR D
LD (HL),A
POP DE
LD DE,32
ADD HL,DE
DJNZ LS20
LSPSP LD SP,#4020
endif
pops;$
RET
;печать правой части тайла
RSP pushs;$
LD B,32
RS2
if EGA
ld hx,b ;hgt
call setpgsscr40008000
ld b,h
ld c,l ;scr
;push de
;push bc
;push ix
;call prtile
;pop ix
;pop bc
;pop de
set 7,e
inc bc
call prtile
call setpgsmain40008000
else
LD (RSPSP+1),SP
EX DE,HL
LD SP,HL
EX DE,HL
RS20 POP DE
POP DE
LD A,(HL)
OR E
Ainv4 XOR D
LD (HL),A
LD DE,32
ADD HL,DE
DJNZ RS20
RSPSP LD SP,#4020
endif
pops;$
RET
RSPB pushs;$
JR RS2
LSPB pushs;$
JR LS2
ALLSPF
if EGA
ei
ld de,sprpal
OS_SETPAL
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,1
OS_SETSCREEN
ld e,0 ;color byte
OS_CLS
call ALLSPpp
jr $
;call changescrpg
;ld e,a
;OS_SETSCREEN
ret
include "pal.ast" ;sprpal
ALLSPpp
endif
LD A,(FLR) ;вывод обоих этажей
OR A
JR NZ,ALLSP
INC A
CALL FLOOR
CALL ALLSP
XOR A
CALL FLOOR
ALLSP
if EGA
ld hl,scrbase+(40*4)+2
else
LD HL,DSCR+128+2
endif
LD A,(SH)
OR A
JR Z,AP1
DEC HL
AP1 LD DE,(X0)
LD (TX),DE
LD C,20
AP2 LD B,15
PUSH DE
AP3 CALL MSizeP
LD DE,(TX)
INC E
DEC D
LD (TX),DE
INC HL
INC HL
DJNZ AP3
if EGA
ld de,+(40*4)-30-1
else
LD DE,128-30-1
endif
ADD HL,DE
POP DE
INC D
LD (TX),DE
PUSH DE
LD B,15
AP4 CALL MSizeP
LD DE,(TX)
INC E
DEC D
LD (TX),DE
INC HL
INC HL
DJNZ AP4
if EGA
ld de,(40*4)-30+1
else
LD DE,128-30+1
endif
ADD HL,DE
POP DE
INC E
LD (TX),DE
DEC C
JR NZ,AP2
RET
DSC3 LD B,8
PUSH DE
DS3 PUSH DE
PUSH BC
INC DE
LDI
LDI
LDI
LDI;4
LDI
LDI
LDI
LDI;8
LDI
LDI
LDI
LDI;12
LDI
LDI
LDI
LDI;16
LDI
LDI
LDI
LDI;20
LDI
LDI
LDI
LDI;24
LDI
LDI
LDI
LDI;28
LD DE,4
ADD HL,DE
POP BC
POP DE
INC D
DJNZ DS3
POP DE
LD A,32
ADD A,E
LD E,A
DEC C
JR NZ,DSC3
RET
OUTDSC CALL MEM7
LD DE,SCR+32
LD HL,DSCR+1024+2
LD C,7
CALL DSC3
LD DE,SCR+2048
LD C,8
CALL DSC3
LD DE,SCR+4096
LD C,1
CALL DSC3
JP PT128
FLR EQU G00+1 ;этаж 1-1й 0-2й
FLOOR OR A ;сменить этаж на А(0-2Й;1-1Й)
LD A,(FLR)
JR NZ,FLO2
OR A
RET Z
XOR A ;2й
LD (FLR),A
PUSH BC
LD C,3
LD A,#E0
FLO_ LD (GS1+1),A
LD A,(X0)
ADD A,C
LD (X0),A
LD A,(Y0)
ADD A,C
LD (Y0),A
POP BC
RET
FLO2 OR A
RET NZ
INC A
LD (FLR),A
PUSH BC
LD C,-3
LD A,#F0
JR FLO_
LCOUNT LD DE,vSIZE ;подсчёт высоты
LD HL,#B000
LD B,96
LCX PUSH BC
PUSH HL
LD BC,#1F00
LCX0 LD A,(HL)
OR A
JR NZ,LCX2
INC HL
INC HL
LD A,(HL)
OR A
JR NZ,LCX2
INC HL
INC HL
INC C
DJNZ LCX0
LCX2 LD A,C
LD (DE),A
INC DE
POP HL
LD BC,128
ADD HL,BC
POP BC
DJNZ LCX
XOR A
LD (DE),A
RET
if 1
DD RLCA
WA RLCA
BA ADD A,L
LD L,A
JR NC,BA_
INC H
BA_ LD A,(HL)
RET
endif
if 1
GET_AD RLCA ;Взять описатель(MAN+A*32) ->HL
RLCA
RLCA
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
LD A,MAN/256
ADD A,H
LD H,A
RET
GET_IX CALL GET_AD;То же для IX
PUSH HL
POP IX
RET
endif
if 1
HERLIV LD A,(IX+8) ;IX-жив? Z-нет
OR A
RET Z
LD A,(IX+13)
OR A
RET Z
CP (IX+26)
RET NC
XOR A
RET
endif
if 1
NORM_V
if EGA == 0
LD A,#AA ;вкл.норм.отобр
LD (Ainv1),A
LD (Ainv2),A
LD (Ainv3),A
LD (Ainv4),A
endif
RET
endif