DEVICE ZXSPECTRUM1024
 
        include "../../_sdk/sys_h.asm"
 
_128=PROGSTART+3
 
swapimer=PROGSTART+6
 
ttexpgs=PROGSTART+0x100
 
 
 
LEVDAT  EQU     #79C0 ;адр. нач данных уровня
 
        ORG     LEVDAT
 
begin
 
DSCR    EQU 0xc000;#4000
 
 
 
;*D-
 
;********* Победа людей ****************
 
 
 
isRUNC  ; кодовый блок
 
         nop
 
         ;jr $
 
        ;LD A,0  ;люди
 
        LD A,1 ;кунги
 
        JP F_CUTh
 
 
 
;--------характеристики сторон-------(0)-обнулять вначале
 
 
 
;параметры играющего
 
;hTOWER DEFB 4 ;мак.число типов вооруж (1-4)
 
;hARC   DEFB 0 ;0-2 (0)
 
hHORSE  DEFB 1 ;0-3 (0)
 
hSHILD  DEFB 0 ;0-2 (0)
 
hBLADE  DEFB 1 ;0-2 (0)
 
hmaxC   DEFB 3 ;1-3 чиcло возможн иccл закл свящ
 
hmaxW   DEFB 3 ;1-3 число  --"-- закл волш
 
 
 
;дополнительные параметры играющего
 
hmaxB1  DEFB 2 ;макс число стандарт зданий (0 или 1-2)
 
hmaxB2  DEFB 4 ;maкc число доп эданий (0, 1-4)
 
hWALL   DEFB 17 ;0/17 - можно/нельзя строить стены
 
 
 
;параметры компьютера
 
kTOWER  DEFB 4 ;1-4
 
kARC    DEFB 0 ;0-2
 
kHORSE  DEFB 2 ;0-3
 
kSHILD  DEFB 1 ;0-2
 
kBLADE  DEFB 1 ;0-2
 
kmaxC   DEFB 3 ;1,3 чиcло иccл закл (0-нет свящ)
 
kmaxW   DEFB 3 ;1..3 чиcло иccл закл (0-нет волш)
 
 
 
;----------- параметры стратегии врага ----------------
 
;/wSTRATEG  (1.ед.изм - 8тик)
 
levMAX  DEFB 8   ;макс число народу в группе (для уровня) = 1..10
 
levDEL  DEFB 41  ;средн задержка межд сборами (для уровня) = 1..X
 
lev1ST  DEFB 221 ;нач задержка первого сбора = 1..
 
 ;Тип уровня 0 ;обычный
 
 ;Тип уровня 1 ;атакованый охранник становится атакующим
 
 ;Тип уровня 2 ;см. тип 1 + охранники иногда идут в атаку
 
levTYP  DEFB 0   ;тип уровня (0-обычный)
 
;-------- цветовые настройки -------
 
COLOR   DEFB #28 ;цвет поля
 
 
 
;-------- общие параметры уровня -----
 
MASTER  DEFB 0  ; кто играет 0/1 - люди?кунги
 
LEVEL   DEFB 15  ; номер уровня
 
MONEY   DEFB 0,0,3,0,0,0 ;деньги
 
WOOD    DEFB 0,0,0,5,0,0 ;леc
 
TASK_M  ;задание: 3 строки по 20+1 символов = 63
 
        ds 63 ;*B ..\TASK\w115.tsk
 
LEVRES  DEFB 0,0,0,43,0,0,127 ;текущее время прохождения
 
 
 
;------- используемые файлы -------
 
 
 
fsLAND  DEFB 2; 1-4
 
fsMUS   DEFB 0; 0-7
 
 
 
 
 
;****************** Инициализируемые переменные ****************
 
;--------------- (входят в описание каждого уровня) ------------
 
;/выбраные герои
 
SEL_T DEFB 0 ;0-none;1-один;2-6-group;7-кунг,8-здание
 
SEL_N DEFB 0,0,0,0,0,0 ;номера 6 выбр гер/зд
 
 
 
sel_en DEFB #FF ;выбранный враг-цель
 
sel_ti DEFB 0 ;время отображения цели
 
 
 
;/outLED
 
LED DEFB 4,3,4,3,4,3
 
 
 
;/putTX
 
_msg    DEFB #FF
 
pTX_AD  DEFW 0;WNAMES
 
TX_AD   DEFW 0;WNAMES
 
pTXdel  DEFB 0 ;t задержки на выв экcтр cообщ
 
 
 
;/M_PLAT
 
isPLAT  DEFB 0; 0/1-есть/нет площадки
 
szPLAT  DEFB 0; размер площадки под стр-во (1..3, 0-нет)
 
bcPLAT  DEFW 0; размеры
 
adPLAT  DEFW 0; позиция in ATR
 
waPLAT  DEFB 0; если стена - 1
 
 
 
;/PAUSE
 
onPAUS  DEFB 1 ;0-включить паузу
 
 
 
;/SOUNDn
 
NOTA    DEFW se ;текущ нота <---- ПРЕРЫВАНИЕ ПИШЕТ СЮДА
 
se      DEFW #FFFF ;конст
 
levSND  DEFB 0 ;0-макс громкость
 
sIY56   DEFW 0 ;координаты снарядов
 
priv_S  DEFB 0 ;текущ приоритет (0-нет мелодии)
 
NOTA2   DEFW se ;нота новой мелодии
 
priv_2  DEFB 0  ;нов приор
 
 
 
;/STRATEG - variables
 
pntX    DEFB 32  ;-коорд т.сбора
 
pntY    DEFB 31  ;-/
 
pntNUM  DEFB 0   ;-число оставшихся до конца сбора воинов (0-конец сбора, 255-нов сбор)
 
pntDEL  DEFB 22  ;-время до нач.след сбора/задержка на пр-во воина
 
pntTAR  DEFB #FF ;-объект атаки (0-101 - воины, #80.. -здания, #FF-нет)
 
pntUNI  DEFB 0   ;-отряд разнородный/однородный (0/member typ)
 
pntEN   DEFB 0,0,0,0,0,0
 
                 ;-разреш пр-во вида (3..8) (0-нет)
 
pntMAN  DEFB 0   ;тип пораждаемого воина
 
 
 
;/isEND
 
END_1   DEFB 0  ;0/1/2-none/нет врагов/нет людей
 
END_2   DEFB 0  ;не0-князь вошёл в пещеру
 
TheEND  DEFB 0  ;0/1/2-none/победа людей/победа врагов (устанавл в _cLOOP)
 
 
 
        if 1==1
 
;надо загрузить brfinal.dat и странички
 
;*P0;
 
;        ORG #C000
 
;*B ..\INTRO\FLICK.LPZ\WANIu_0.LPZ
 
;*P1;
 
;        ORG #C000
 
;*B ..\INTRO\FLICK.LPZ\WANIu_1.LPZ
 
;*P3;
 
;        ORG #C000
 
;*B ..\INTRO\FLICK.LPZ\WANIv_0.LPZ
 
;*P4;
 
;        ORG #C000
 
;*B ..\INTRO\FLICK.LPZ\WANIv_1.LPZ
 
;*P6;
 
;        ORG #C000
 
;*B ..\INTRO\FLICK.LPZ\WANIw_0.LPZ
 
;*P7;
 
;        ORG #C000
 
;*B ..\INTRO\FLICK.LPZ\WANIw_1.LPZ
 
loader
 
 
 
        ld hl,texfilename
 
        ld de,0x8000 ;addr
 
        ld b,7
 
getttexpgs0
 
        push bc
 
         ld a,(hl)
 
         call _128
 
        inc hl
 
        push hl
 
        push de ;addr
 
        ex de,hl
 
        OS_OPENHANDLE
 
        pop de ;addr
 
        push bc
 
        ;ld de,0xc000 ;addr
 
        ld hl,0x4000 ;size
 
        OS_READHANDLE
 
        pop bc
 
        OS_CLOSEHANDLE
 
                
 
        pop hl
 
        ld b,1
 
        xor a
 
        cpir ;after 0
 
        pop bc
 
        ld de,0xc000 ;addr
 
        djnz getttexpgs0
 
 
 
        call swapimer
 
        ;im 2
 
        
 
        pop af
 
        ld (0x8000),a
 
 
 
        jp 0x8001
 
        
 
texfilename
 
        db 0,"brfinal.dat",0
 
        db 0,"branix_0.dat",0
 
        db 1,"branix_1.dat",0
 
        db 3,"braniy_0.dat",0
 
        db 4,"braniy_1.dat",0
 
        db 6,"braniz_0.dat",0
 
        db 7,"braniz_1.dat",0
 
 
 
        endif
 
 
 
Sc1
 
        incbin "../barkov/w_end_k.scr"
 
Sc2
 
        incbin "../barkov/w_end2.scr"
 
 
 
F_CUTh  ;DI
 
        ;IM 1
 
        LD SP,LEVDAT-2
 
        LD B,A
 
        PUSH BC
 
        CALL OFFD
 
         xor a
 
        CALL _128
 
        
 
        if 1==1
 
        call swapimer
 
        ;im 1
 
        ld e,3
 
        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 de,RSTPAL
 
        OS_SETPAL
 
        ;OS_GETSCREENPAGES
 
;de=страницы 0-го экрана (d=старшая), hl=страницы 1-го экрана (h=старшая)
 
        ld a,(user_scr0_high) ;ok
 
        SETPG32KHIGH
 
        endif
 
 
 
        LD HL,Sc1
 
        CALL COPYAT
 
 
 
        ;пробел?
 
lggP    LD BC,#7FFE
 
        IN A,(C)
 
        AND %1
 
        JR NZ,lggP
 
 
 
        CALL OFFD
 
 
 
        LD HL,Sc2
 
        CALL COPYAT
 
 
 
        if 1==1
 
        jp loader
 
RSTPAL
 
        STANDARDPAL
 
 
 
        else
 
 
 
        CALL A_or_B
 
        LD (tDRIVE),A
 
        CALL OFFD
 
        ;чтение трек 0, сек 9 по 23845
 
A009    EQU     23845
 
L1st    CALL TR000
 
        LD DE,#09
 
        LD B,1
 
        LD HL,A009
 
        PUSH HL
 
        CALL D_READ ;загр. табл.ф-лов
 
        POP HL
 
        JR C,L1st
 
        ;проверка метки диска D1,BB
 
        LD A,(HL)
 
        CP #D1
 
        JR NZ,L1st
 
        INC HL
 
        LD A,(HL)
 
        CP #BB
 
        JR NZ,L1st
 
        ;перенос т.ф-лов
 
        POP BC
 
        LD A,(tDRIVE)
 
        JP A009+2
 
        endif
 
 
 
        if 1==0
 
;------------------- вспом п/п
 
 
 
A_or_B  ;возвр: 0/1 - A/B
 
        NOP
 
        LD BC,#7FFE
 
        IN A,(C)
 
        AND %10000
 
        LD A,1
 
        RET Z
 
        LD B,#FD
 
        IN A,(C)
 
        AND %1
 
        RET Z
 
        JR NZ,A_or_B
 
        endif
 
 
 
        if 1==0
 
;TODO fix
 
_128    LD A,%10000
 
        LD      BC,#7FFD
 
        OUT     (C),A
 
        RET
 
        endif
 
 
 
OFFD    LD      DE,DSCR+#1AFE
 
        PUSH DE
 
        POP HL
 
        INC HL
 
        LD      BC,768
 
        LD      (HL),0
 
        LDDR
 
        LD      BC,6143
 
        LD      (HL),255
 
        LDDR
 
        RET
 
 
 
COPYAT  ;из HL
 
        LD      BC,6912
 
        LD      DE,DSCR
 
        LDIR
 
        RET
 
 
 
        if 1==0
 
;-------tr/dos
 
RG_DOS  LD      IX,#2A53 ;выв в рег TRDOS (out (C),A:ret)
 
        JR      DOS
 
 
 
DOS     PUSH    IX
 
        JP      #3D2E
 
 
 
POS     ;позиционир трек
 
        LD C,#3C
 
        LD A,(SIDE)
 
        OR A
 
        JR      Z,DW_SID
 
        RES     4,C
 
DW_SID  LD A,(tDRIVE)
 
        OR C
 
        LD      C,#FF
 
        CALL    RG_DOS
 
        LD      A,D
 
        LD      C,#7F
 
        CALL    RG_DOS
 
        LD      A,#18
 
        LD      IX,#2F57 ;вып ком TRDOS
 
        JP DOS
 
 
 
RD_SCT  LD      BC,RD_SCT ;по этому адресу = 1
 
        PUSH    BC
 
        LD      BC,#17F
 
        LD      IX,#2090  ;чтение сектора из п/п форматирования(портит#5cd6)
 
        JR      DOS
 
 
 
TR000   CALL TR00 ;иниц дисковода + задержка
 
        CALL TR00
 
        CALL TR00
 
TR00    DI
 
        LD      D,0
 
        CALL    POS
 
        LD      IX,#2F65 ;ld a,8:jr 2f57
 
        JR      DOS
 
 
 
tDRIVE  DEFB 0
 
SIDE    DEFB 0
 
 
 
D_READ  DI ;E-sec,D-trk,B-sec.num,HL-mem.adr
 
        CALL    POS
 
        LD      A,(#5CD6)
 
        EX      AF,AF'
 
NXT_S   DEFB    #DD
 
        LD      L,#3 ;retry.num
 
NXT_SC  PUSH    HL
 
        PUSH    BC
 
NXC_C1  PUSH    IX
 
        LD      C,#5F
 
        LD      A,E
 
        CALL    RG_DOS
 
        CALL    RD_SCT
 
        DI
 
        LD      HL,#5CD6
 
        EX      AF,AF'
 
        CP      (HL)
 
        POP     IX
 
        JR      Z,GOOD
 
        LD      (HL),A
 
        DEFB    #DD
 
        DEC     L
 
        POP     BC
 
        POP     HL
 
        JR      Z,ERR_RW
 
        EX      AF,AF'
 
        JR      NXT_SC
 
GOOD    POP     BC
 
        POP     HL
 
        EX      AF,AF'
 
GOOD1   INC     E
 
        LD      A,E
 
        CP      #F9
 
        JR      C,OLD_TR
 
        LD      E,#F4
 
        INC     D
 
        CALL    POS
 
OLD_TR  INC     H
 
        INC     H
 
        INC     H
 
        INC     H
 
        DJNZ    NXT_S
 
        XOR     A
 
        RET
 
 
 
ERR_RW  SCF
 
        RET
 
 
 
        endif
 
end
 
        savebin "br/br217.dat",begin,end-begin ;in current dir (not in dir of this source)