DEVICE ZXSPECTRUM1024
 
        include "../../_sdk/sys_h.asm"  
 
 
 
        include "settings.ast"
 
 
 
        SLOT 0
 
        page 8
 
        SLOT 3
 
 
 
EGA=1
 
FREESCROLL=1;TODO 0
 
PRFULLMAP=0
 
 
 
MEGALZ=1 ;тексты диалогов не в Hrust2
 
 
 
STACK=0x4000;0x61a8
 
GAMESTACK=0x3f80;0xFFFF 
 
 
 
INT_IM2=0
 
SETIM2_TWICE=0
 
INT_USE_BC=1-EGA
 
 
 
scrbase=0x4000+4
 
iconsscraddr=scrbase+25+(32*40)
 
faceiconsscraddr=scrbase+(17*8*40)+1
 
sprmaxwid=48;32
 
sprmaxhgt=32
 
scrwid=128+8;160 ;double pixels
 
scrhgt=192;200
 
INTSTACK=0x3f00
 
tempsp=0x3f06 ;6 bytes for prspr 
 
 
 
FIXMOUSE=0 ;так в VERAENGN, а 1 в исходнике
 
 
 
FILAT   EQU 8*6+64  ;атриб. окна
 
FILAT2  EQU 8*6+1+64 ;атриб. кнопки
 
 
 
PGTILES0=0x20
 
PGTILES1=0x21
 
PGTILES2=0x22
 
PGTILES3=0x23
 
PGICONS=0x24
 
PGSPRITES0=0x25
 
PGSPRITES1=0x26
 
PGSPRTRAN0=0x27
 
PGSPRTRAN1=0x28
 
PGHUD=0x29
 
PGDAYNIGHT=0x2a
 
 
 
szARROWS=45*32
 
 
 
;25.08.08
 
;Переменные для игры
 
;IM2     EQU #6666 ;расположение вторых прерываний
 
SHADSCR EQU #4000 ;Теневой экран (линейный)
 
SCR     EQU #C000 ;Основной экран
 
SCRWD   EQU 24    ;ширина видимого экрана в знакоместах
 
SCRHG   EQU 24    ;высота видимого экрана в -/-
 
FRAME   EQU 2     ;кол-во фреймов между обновлениями экрана
 
MAX_X   EQU 245   ;Предел для курсора по X
 
MAX_Y   EQU 181   ;Предел для курсора по Y
 
QVESH   EQU 18 ;кол-во вещей в мешке
 
SPD_HERO EQU 1 ;V перемещения героя (меньше число - больше V)
 
ROTSPD  EQU 2 ;скорость поворота героя при взятии предметов
 
STEPS   EQU 2 ;кол-во пикселей на кот. перемещ. герой за 1 шаг
 
STEP1   EQU (16/STEPS)-1
 
STEP2   EQU (8/STEPS)-1
 
DSTV    EQU 1 ;На сколько близко должна наход. вещь от героя
 
DSTP    EQU 2 ;На сколько близко должен наход. персонаж от героя
 
FR      EQU 16 ;частота мигания курсора
 
SCMOD   EQU 20 ;задержка перед входом в режим скролла карты
 
FRM     EQU 25 ;частота (фреймов) мигания кнопок в диалоге
 
FRM2    EQU 6 ;кол-во фреймов на кот. показывается курсор пути
 
PERS    EQU 10 ;кол-во персонажей в игре с кот. можно разговар.
 
TOKEN   EQU 7 ;кол-во управляющих кодов (токенов) в тексте-1
 
MAXTASK EQU 5 ;макс. кол-во задач
 
SPD_NGT EQU 1200 ;кол-во фреймов, через кот. скролл. спрайт дня
 
                 ;эта единица является игровым часом
 
VIDSPD  EQU 3 ;скор. видео (MAX 2)
 
COUNT   EQU 26 ;кол-во миганий героя
 
 
 
;Страницы
 
PG_SPR  EQU 0 ;6912:спрайты 2*2 512 штук, EGA:cursors
 
PG_MAP  EQU 1 ;карта,массив,путь,скрипты,звуки
 
PG_EXCH=2 ;для обмена с 0x9000 (VIDEOS)
 
PG_MISC EQU 3 ;распак. текст,ключевой кадр, упак.карта,массив
 
PG_HERO EQU 4 ;спрайты героя
 
PG_MUZ  EQU 6 ;Плеер,музыка
 
PG_VIEW EQU 7 ;упак. экран
 
 
 
        ;slot 3
 
        ;page 0
 
        org PROGSTART
 
begin
 
        jp begin2 ;/prsprqwid (sprites in file are made so that they return here)
 
begin2
 
        ld sp,STACK
 
        OS_HIDEFROMPARENT
 
 
 
        ld e,3+0x80 ;6912+keep
 
        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
 
        ;ld e,0
 
        ;OS_SETSCREEN
 
        ;ld e,0 ;color byte
 
        ;OS_CLS
 
 
 
        OS_GETMAINPAGES
 
;dehl=pages in 0000,4000,8000,c000 
 
        ld a,e
 
        ld (pggfx),a
 
        ld a,h
 
        ld (pgcode8000),a
 
        ld a,l
 
        ld (pgcodec000),a 
 
        ;OS_NEWPAGE
 
        ;ld a,e
 
        ld (tpgs+0),a
 
 
 
        OS_NEWPAGE
 
        ld a,e
 
        ld (tpgs+PG_EXCH),a
 
 
 
        OS_NEWPAGE
 
        ld a,e
 
        ld (pgfake),a ;эту страницу можно будет запарывать при отрисовке спрайтов с клипированием
 
        ld (pgfake2),a
 
        ;OS_NEWPAGE
 
        ;ld a,e
 
        ;ld (pgmain4000),a 
 
        
 
        ld de,res_path
 
        OS_CHDIR
 
        ;ld de,muzfilename
 
        ;call openstream_file
 
        ;ld a,7
 
        ;call setpg
 
        ;ld de,music
 
        ;ld hl,music_sz
 
        ;call readstream_file
 
        ;call closestream_file
 
        
 
        ld hl,levelfilenames
 
loadlevels0
 
        ld a,(hl) ;pg
 
        inc hl
 
        cp -1
 
        jr z,loadlevels0q
 
       or a
 
       jr z,loadlevels0_nonewpg
 
       push hl
 
       ld h,tpgs/256
 
       ld l,a
 
       push hl
 
       OS_NEWPAGE
 
       pop hl
 
       ld (hl),e
 
       ld a,l
 
       pop hl
 
loadlevels0_nonewpg
 
        call setpg
 
        ld e,(hl)
 
        inc hl
 
        ld d,(hl)
 
        inc hl
 
        push hl
 
        push de ;addr
 
        ex de,hl
 
        call openstream_file
 
        pop de
 
        ld hl,0x4000
 
        call readstream_file
 
        call closestream_file
 
        pop hl
 
        xor a
 
        ld b,a
 
        ld c,a
 
        cpir ;hl=after #0
 
        jr loadlevels0
 
loadlevels0q
 
 
 
        if !EGA
 
        ld a,(user_scr1_high) ;ok
 
        SETPG16K
 
        ld a,PG_VIEW
 
        call PAGE
 
        ld hl,0xc000
 
        ld de,0x4000
 
        ld bc,0x4000
 
        ldir
 
        ld a,(user_scr0_high) ;ok
 
        SETPG16K
 
        call setpggfxc000
 
        ld hl,0xc000
 
        ld de,0x4000
 
        ld bc,0x4000
 
        ldir
 
        call setpgcodec000
 
        endif 
 
 
 
        ;call PAGE_PG_VIEW
 
        ;ld hl,wasARROWS
 
        ;ld de,ARROWS
 
        ;ld bc,szARROWS
 
        ;ldir ;TODO recode for EGA
 
 
 
        ld a,PGDAYNIGHT
 
        call setpg
 
        ld hl,0xc000
 
        ld de,0xc000+(152*32/2)
 
        ld bc,48*32/2
 
        ldir
 
        ld hl,0xc000+(200*32/2)
 
        ld de,0xc000+(200*32/2)+(152*32/2)
 
        ld bc,48*32/2
 
        ldir
 
 
 
        call changescrpg_current
 
       ;ld (curscrnum_int),a
 
 
 
        xor a
 
        call setpg
 
 
 
        ld hl,prsprqwid
 
        ld (0x0101),hl ;спрайты в файле подготовлены так, что выходят в 0x0100
 
 
 
        jp MMENU
 
 
 
       if RUS
 
varsfn
 
        db "vars.bin",0
 
savefn
 
        db "vera.ini",0
 
       else
 
varsfn
 
        db "varseng.bin",0
 
savefn
 
        db "veraeng.ini",0
 
       endif
 
        
 
        align 256
 
tpgs
 
        ds 64;256
 
 
 
        include "palev.ast" ;verapalevening
 
        include "palnight.ast" ;verapalnight
 
        include "paldawn.ast" ;verapaldawn
 
        include "palday.ast" ;verapalday
 
standardpal
 
        STANDARDPAL
 
pal
 
        ds 32,0xff
 
emptypal
 
        ds 32,0xff 
 
 
 
egaon
 
        db 0 ;/1
 
 
 
quiter
 
        if 1==0
 
        halt
 
pgmuznum=$+1
 
        ld a,0
 
        SETPG32KHIGH
 
          ld hl,muz
 
          OS_SETMUSIC 
 
        halt
 
        endif
 
        call swapimer
 
        im 1
 
        call killmuz ;because we played music not by OS
 
        QUIT
 
 
 
killmuz
 
        ld a,0xfe
 
        call shut1ay
 
        ld a,0xff
 
shut1ay
 
        ld bc,0xfffd
 
        out (c),a
 
        ld de,0x0e00
 
shutay0
 
        dec d
 
        ld b,0xff
 
        out (c),d
 
        ld b,0xbf
 
        out (c),e
 
        jr nz,shutay0
 
        ret
 
 
 
redattr_killable2b
 
        dw 0
 
 
 
       if EGA
 
prtileega
 
;Печать тайла 2*2 знакоместа в теневом экране
 
;DE=адрес в теневом экране (D=2*Y+SHADSCR, E=2*X)
 
;HL=адрес тайла (0xc000,0xc020...)
 
;для EGA адрес надо умножить на 4
 
        add hl,hl
 
        add hl,hl
 
        ld a,h
 
        rlca
 
        rlca
 
        and 3
 
        add a,PGTILES0
 
        call setpg
 
        ld a,h
 
        or 0xc0
 
        ld h,a
 
        ex de,hl
 
        res 6,h ;2*Y
 
        ld a,l ;2*X
 
        ld l,h
 
        ld h,0
 
        ld b,h
 
        ld c,l ;hl=bc=2*Y
 
        add hl,hl
 
        add hl,hl
 
        add hl,bc ;10*Y
 
        add hl,hl
 
        add hl,hl ;40*Y
 
        add hl,hl
 
        add hl,hl
 
        add hl,hl
 
        add hl,hl ;16*40*Y
 
       add a,scrbase&0xff
 
        ld c,a ;2*X
 
        ld b,0x40
 
        add hl,bc
 
       call setpgsscr40008000_current ;shadow
 
        ld bc,0x1008
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
        ld a,55 ;"scf"
 
        ld (wasdrawimg),a
 
        jp primgega_onescreen_setpgsmain40008000
 
        ;jp primgega
 
 
 
;Печать блока 3*3 знакоместа на основном экране (FIXME - сейчас на обоих! вызывается в IM2)
 
;HL-адрес спрайта
 
;DE-адрес в экране (а не координаты в обычных знакоместах D-X, E-Y)
 
BLOCK33
 
        ld a,PGICONS
 
        call setpg
 
        ex de,hl
 
        ;ld hl,0x4000+24 ;TODO
 
        ld bc,0x180c
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
primgega
 
        push bc
 
        call setpgsscr40008000;_current ;visible
 
        pop bc
 
        push bc
 
        push de
 
        push hl
 
        call primgega_onescreen
 
        call setpgsscr40008000_current ;shadow
 
        pop hl
 
        pop de
 
        pop bc
 
        jp primgega_onescreen_setpgsmain40008000
 
       endif
 
 
 
       if 1;!EGA
 
setpggfxc000
 
pggfx=$+1
 
        ld a,0
 
        SETPG32KHIGH
 
        ret
 
       endif
 
setpgcodec000
 
pgcodec000=$+1
 
        ld a,0
 
        SETPG32KHIGH
 
        ret
 
 
 
setcurscr1
 
        call setcurscr0
 
        jr setcurscr_change
 
 
 
;Черный экран, текущим делаем 0-й
 
BLACK
 
        ld a,(user_scr0_high) ;ok
 
        SETPG4000
 
        
 
        LD HL,#4000
 
        LD DE,#4001
 
        LD BC,6911
 
        LD (HL),L
 
        LDIR 
 
;        LD A,16
 
;CURSCR  LD (PG_+1),A
 
setcurscr0
 
        ld a,(curscrnum)
 
        or a
 
        jr z,PAGE_PG_VIEW ;nz???
 
setcurscr_change
 
        call changescrpg_current
 
       ld (curscrnum_int),a
 
        ;ld e,a
 
        ;OS_SETSCREEN
 
 
 
PAGE_PG_VIEW
 
       if EGA
 
        LD A,PG_VIEW
 
       else
 
        push bc
 
        ld a,(user_scr1_high) ;ok
 
        SETPGC000
 
        pop bc
 
        ret
 
       endif
 
 
 
;Драйвер переключения страниц для 128-го
 
;A-номер нужной страницы
 
PAGE
 
setpg
 
        push bc
 
        ;and 0xe7
 
         ;cp 2
 
         ;jr z,$
 
         ;cp 5
 
         ;jr z,$
 
        ;ld ($+4),a
 
        ;ld a,(tpgs) ;так нереентерабельно нельзя, т.к. используется и в обработчике прерываний!
 
        ld c,a
 
        ld b,tpgs/256
 
        ld a,(bc)
 
        SETPGC000
 
        pop bc
 
        ret
 
 
 
;        PUSH BC
 
;        LD (NUMPAGE),A
 
;PG_     OR 16+8
 
;        LD BC,#7FFD
 
;        OUT (C),A
 
;        POP BC
 
;        RET 
 
;NUMPAGE DB 0
 
 
 
setpgscr7
 
        push bc
 
        ld a,(user_scr1_high) ;ok
 
        SETPGC000
 
        pop bc
 
        ret
 
 
 
       if EGA
 
swapre
 
arroffega_scraddr2=$+1
 
        ld de,0
 
        ld hl,(arroffega_scraddr)
 
        ld (arroffega_scraddr),de
 
        ld (arroffega_scraddr2),hl
 
arroffega_bufaddr2=$+1
 
        LD de,mouse_buf2
 
        ld hl,(arroffega_bufaddr)
 
        ld (arroffega_bufaddr),de
 
        ld (arroffega_bufaddr2),hl
 
        ret
 
       endif
 
 
 
FMCNT2  DB SCMOD ;счетчик
 
 
 
;Буфер под курсором мышки
 
;(он один для основного экрана и теневого)
 
mouse_buf
 
       if EGA
 
        ds 16*16/2
 
mouse_buf2
 
        ds 16*16/2
 
       else
 
        DS 48
 
       endif
 
;Спрайт курсора
 
ARROW   DS 64
 
;Адреса печатаемых тайлов в теневом экране
 
A_TILE  DS 40*2 ;max 144*2
 
        DB 0
 
 
 
reter
 
        ret
 
 
 
setpgmain4000
 
        ld a,(user_scr0_high) ;ok
 
        SETPG4000
 
        ret
 
 
 
setpgsmain40008000
 
;pgmain4000=$+1
 
        ;ld a,0
 
        ld a,(user_scr0_high) ;ok
 
        SETPG4000
 
pgcode8000=$+1
 
        ld a,0
 
        SETPG8000
 
        ret
 
 
 
setpgscr4000;_current
 
        call getuser_scr_high_cur
 
        SETPG4000
 
        ret
 
 
 
setpgscr4000_scr2
 
        call getuser_scr_high
 
        SETPG4000
 
        ret
 
 
 
setpgsscr40008000;_current
 
        call getuser_scr_low_cur
 
        SETPG4000
 
        call getuser_scr_high_cur
 
        SETPG8000
 
        ret
 
 
 
setpgsscr40008000_current
 
        call getuser_scr_low
 
        SETPG4000
 
        call getuser_scr_high
 
        SETPG8000
 
        ret
 
 
 
setpgc000_shadowscr
 
        call getuser_scr_high
 
        SETPGC000
 
        ret
 
 
 
setpgc000_curscr
 
        call getuser_scr_high_cur
 
        SETPGC000
 
        ret
 
 
 
getuser_scr_low
 
getuser_scr_low_patch=$+1
 
getuser_scr_low_patchN=0xff&(user_scr0_low^user_scr1_low)
 
        ld a,(user_scr1_low) ;ok
 
        ret
 
 
 
getuser_scr_high
 
getuser_scr_high_patch=$+1
 
getuser_scr_high_patchN=0xff&(user_scr0_high^user_scr1_high)
 
        ld a,(user_scr1_high) ;ok
 
        ret
 
 
 
getuser_scr_low_cur
 
getuser_scr_low_cur_patch=$+1
 
getuser_scr_low_cur_patchN=0xff&(user_scr0_low^user_scr1_low)
 
        ld a,(user_scr0_low) ;ok
 
        ret
 
 
 
getuser_scr_high_cur
 
getuser_scr_high_cur_patch=$+1
 
getuser_scr_high_cur_patchN=0xff&(user_scr0_high^user_scr1_high)
 
        ld a,(user_scr0_high) ;ok
 
        ret
 
 
 
changescrpg_current
 
        ld hl,getuser_scr_low_patch
 
        ld a,(hl)
 
        xor getuser_scr_low_patchN
 
        ld (hl),a
 
        ld hl,getuser_scr_high_patch
 
        ld a,(hl)
 
        xor getuser_scr_high_patchN
 
        ld (hl),a
 
        ld hl,getuser_scr_low_cur_patch
 
        ld a,(hl)
 
        xor getuser_scr_low_cur_patchN
 
        ld (hl),a
 
        ld hl,getuser_scr_high_cur_patch
 
        ld a,(hl)
 
        xor getuser_scr_high_cur_patchN
 
        ld (hl),a
 
 
 
        ld a,1
 
curscrnum=$+1
 
        xor 0
 
        ld ($-1),a
 
        ret
 
        
 
        if 1==0
 
changescrpg
 
        call changescrpg_current
 
        ld (curscrnum_int),a
 
        ret
 
        endif
 
 
 
primgega_pgdaynight
 
       ld a,PGDAYNIGHT
 
        jr primgega_pga
 
primgega_pghud
 
       ld a,PGHUD
 
primgega_pga
 
;a=pg
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
        push bc
 
        push de
 
        push hl
 
       push af
 
       ld a,55
 
       ld (im_arroff),a
 
       call ARROFF
 
       pop af
 
       ld (primgega_pg),a
 
       ;ld a,PGHUD
 
       call setpg
 
        call setpgsscr40008000;_current ;visible
 
        pop hl
 
        pop de
 
        pop bc
 
        push bc
 
        push de
 
        push hl
 
        call primgega_onescreen
 
       call ARRON
 
       ld a,55+128 ;"or a"
 
       ld (im_arroff),a
 
primgega_pg=$+1
 
       ld a,PGHUD
 
       call setpg
 
        call setpgsscr40008000_current ;shadow
 
        pop hl
 
        pop de
 
        pop bc
 
        ld a,55 ;"scf"
 
        ld (wasdrawimg),a
 
primgega_onescreen_setpgsmain40008000
 
        call primgega_onescreen
 
        jp setpgsmain40008000
 
primgega_onescreen
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
;call from DAY_NGT
 
primgega0
 
        push bc
 
        ld hx,b
 
        push hl
 
        ld bc,40
 
primgegacolumn0
 
        ld a,(de)
 
        inc de
 
        ld (hl),a
 
        add hl,bc
 
        dec hx
 
        jr nz,primgegacolumn0
 
        pop hl
 
        ld a,0x9f;0xa0
 
        cp h
 
        ld bc,0x4000
 
        adc hl,bc
 
        jp pe,primgegacolumn0q ;в половине случаев
 
;8000->с000 (надо 6000) или a000->e001 (надо 4001)
 
         inc a
 
        xor h
 
        ld h,a
 
primgegacolumn0q
 
        pop bc
 
        dec c
 
        jr nz,primgega0
 
        ret
 
 
 
getimgega_onescreen
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
;call from DAY_NGT
 
getimgega0
 
        push bc
 
        ld hx,b
 
        push hl
 
        ld bc,40
 
getimgegacolumn0
 
        ld a,(hl)
 
        ld (de),a
 
        inc de
 
        add hl,bc
 
        dec hx
 
        jr nz,getimgegacolumn0
 
        pop hl
 
        ld a,0x9f;0xa0
 
        cp h
 
        ld bc,0x4000
 
        adc hl,bc
 
        jp pe,getimgegacolumn0q ;в половине случаев
 
;8000->с000 (надо 6000) или a000->e001 (надо 4001)
 
         inc a
 
        xor h
 
        ld h,a
 
getimgegacolumn0q
 
        pop bc
 
        dec c
 
        jr nz,getimgega0
 
        ret
 
 
 
climgega
 
;in IM2
 
        ;ld a,55 ;"scf"
 
        ;ld (wasdrawimg),a
 
        push bc
 
        push de
 
        push hl
 
       ;ld a,55
 
       ;ld (im_arroff),a
 
       ;call ARROFF
 
        call setpgsscr40008000;_current ;visible
 
        pop hl
 
        pop de
 
        pop bc
 
        push bc
 
        push de
 
        push hl
 
        call climgega_onescreen
 
       ;call ARRON
 
       ;ld a,55+128 ;"or a"
 
       ;ld (im_arroff),a
 
        call setpgsscr40008000_current ;shadow
 
        pop hl
 
        pop de
 
        pop bc
 
        ;ld a,55 ;"scf"
 
        ;ld (wasdrawimg),a
 
climgega_onescreen
 
;b=hgt,c=wid (/2)
 
;e=gfx byte
 
;hl=scr
 
climgega0
 
        push bc
 
        ld hx,b
 
        push hl
 
       ld a,e
 
        ld bc,40
 
climgegacolumn0
 
        ld (hl),a
 
        add hl,bc
 
        dec hx
 
        jr nz,climgegacolumn0
 
        pop hl
 
        ld a,0x9f;0xa0
 
        cp h
 
        ld bc,0x4000
 
        adc hl,bc
 
        jp pe,climgegacolumn0q ;в половине случаев
 
;8000->с000 (надо 6000) или a000->e001 (надо 4001)
 
         inc a
 
        xor h
 
        ld h,a
 
climgegacolumn0q
 
        pop bc
 
        dec c
 
        jr nz,climgega0
 
        ;call setpgcodec000
 
        jp setpgsmain40008000
 
 
 
clsega
 
        call changescrpg_current
 
        call clsega_onescreen
 
        call changescrpg_current
 
clsega_onescreen
 
        call setpgsscr40008000
 
        ld hl,0x4000
 
        ld de,0x4001
 
        ld bc,0x7fff
 
        ld (hl),l;0
 
        ldir
 
        jp setpgsmain40008000
 
 
 
;Работа меню при IM2
 
IM2MEN
 
        LD HL,IM2MC
 
        INC (HL)
 
        LD A,(HL)
 
        CP VIDSPD
 
        JR NZ,IM2M1
 
        LD E,0
 
 
 
;подкл. невидим. стр.
 
        ;LD A,(PG_+1)
 
        ;BIT 3,A
 
        ;LD A,7
 
        ;JR Z,$+4
 
        ;LD A,5
 
        ;PUSH AF
 
        ;CALL PAGE
 
       call setpgc000_shadowscr
 
 
 
        LD HL,(VIDEO_SP)
 
        LD (MMENU2_1),HL
 
        CALL VIDEO_2
 
 
 
        LD HL,mouse_buf
 
        LD DE,A_TILE
 
        LD BC,48
 
        LDIR 
 
        LD HL,(ARRTO+1)
 
        LD (MMN2+1),HL
 
 
 
;невид. делаем видимой
 
        ;POP AF
 
        ;CALL PAGE
 
       call setpgc000_shadowscr ;???
 
        ;LD A,(PG_+1)
 
        ;XOR 8
 
        ;LD (PG_+1),A
 
       call changescrpg_current
 
       ld (curscrnum_int),a
 
       ld e,a
 
       OS_SETSCREEN
 
        JR IM2M2
 
 
 
IM2M1
 
;подкл. видим. стр.
 
        ;LD A,(PG_+1)
 
        ;BIT 3,A
 
        ;LD A,5
 
        ;JR Z,$+4
 
        ;LD A,7
 
        ;CALL PAGE
 
       call setpgc000_curscr
 
 
 
        CALL ARROFF
 
IM2M2   CALL ARRON
 
        JP MUS
 
 
 
MMENU2
 
MMENU2_1=$+1
 
        LD HL,VIDEOS
 
        LD A,0 ;счетчик фреймов
 
IM2MC   EQU $-1
 
        CP VIDSPD+1
 
        RET NZ
 
        XOR A
 
        LD (IM2MC),A
 
 
 
        LD (VIDEO_SP),HL
 
        ;LD A,(PG_+1)
 
        ;BIT 3,A   ;подкл. невидим. стр.
 
        ;LD A,7
 
        ;JR Z,$+4
 
        ;LD A,5
 
        ;CALL PAGE
 
       call setpgc000_shadowscr
 
 
 
        LD IX,A_TILE
 
MMN2    LD HL,0
 
        CALL ARRTO+3
 
 
 
;Вывод 1 кадра видео
 
VIDEO
 
        LD E,1
 
VIDEO_2
 
        LD (VIDSP+1),SP
 
VIDEO_SP=$+1
 
VID1m2=$+1
 
        LD SP,VIDEOS
 
       jp VID1go
 
VID1
 
        LD (HL),C ;иначе может запороть 0x01xx
 
VID1go
 
        POP HL
 
 
 
;Если процедуру вызывать не внутри
 
;прерывания, то POP HL нужно заменить на
 
;POP BC:LD H,B:LD L,C
 
 
 
        POP BC      ;1 знакоместо
 
        LD (HL),C
 
        INC H
 
        LD (HL),B
 
        INC H
 
 
 
        POP BC
 
        LD (HL),C
 
        INC H
 
        LD (HL),B
 
        INC H
 
 
 
        POP BC
 
        LD (HL),C
 
        INC H
 
        LD (HL),B
 
        INC H
 
 
 
        POP BC
 
        LD (HL),C
 
        INC H
 
        LD (HL),B
 
 
 
        POP BC      ;атрибут
 
        LD H,B
 
        ;LD (HL),C
 
        DJNZ VID1
 
        LD (VIDEO_SP),SP
 
 
 
VIDSP   LD SP,0
 
 
 
VID2_1=$+1
 
        LD A,0      ;счетч. кадров
 
        ADD A,E
 
        CP 5        ;кол-во кадров
 
        JR C,VID4
 
VID3    XOR A
 
        LD HL,VIDEOS
 
        LD (VIDEO_SP),HL
 
VID4    LD (VID2_1),A
 
        RET 
 
 
 
;клавиши "1,2,3,4,5"
 
DIGKp1
 
        db 0
 
 
 
KEYSp1
 
        db 0
 
 
 
;клавиши мыши+колесо
 
MKEYSp1
 
        db 0
 
 
 
        include "int.asm"
 
        include "prspr.asm"
 
        include "saveload.asm" ;Загрузка/запись состояния игры
 
        include "IM2.asm"
 
        INCLUDE "PRINT.asm" ;печать спрайтов, текста и т.п.
 
        INCLUDE "TALK.asm"  ;Обслуживание диалогов
 
        include "talktext.asm"
 
 
 
;Начало сохраняемых переменных
 
VARS    INCLUDE "VARS.asm" ;реально они будут сюда распаковываться
 
ENDVARS
 
LEN_S   EQU (256*6)-(ENDVARS-VARS)
 
        display "VARS=",VARS
 
        display "LEN_S=",LEN_S
 
daynightphase
 
        db 0
 
       if EGA
 
gamemenucolorline;=#DAD9
 
        ds 6
 
       else
 
gamemenucolorline=#DAD9
 
       endif
 
 
 
       if EGA
 
NEV1
 
        xor d
 
NEV2
 
        xor h
 
NEV3
 
        xor l ;если в этих ячейках 0 - рисовать только силуэт
 
       endif
 
        DS LEN_S;-3 ;добираем до 6-ти секторов
 
endvars
 
        
 
ABOT
 
        ;DISP #4000
 
        include "about.asm"
 
;        ENT 
 
;LENPR   EQU $-ABOT
 
        ;DISPLAY "ABOUT=",ABOT,LENPR
 
 
 
       display "=",$
 
res_path
 
        db "vera",0
 
 
 
levelfilenames
 
        db 0
 
        dw SPR;0xc000
 
        db "0_page.bin",0
 
        db 1
 
        ;dw DNPK
 
        dw 0xc000;DNPK
 
mapfn
 
       if RUS
 
        db "1_page.bin",0
 
       else
 
        db "1_pageng.bin",0
 
       endif
 
        db 3
 
        dw 0xc000
 
       if RUS
 
        db "3_page.bin",0
 
       else
 
        db "3_pageng.bin",0
 
       endif
 
        db 4
 
        dw 0xc000
 
        db "4_page.bin",0
 
        db 6
 
        dw 0xc000
 
        db "6_page.bin",0
 
        db 7
 
        dw 0xdb00
 
        db "7_page.bin",0
 
        db PGTILES0;8
 
        dw 0xc000
 
        db "tiles0.bin",0
 
        db PGTILES1;9
 
        dw 0xc000
 
        db "tiles1.bin",0
 
        db PGTILES2;10
 
        dw 0xc000
 
        db "tiles2.bin",0
 
        db PGTILES3;11
 
        dw 0xc000
 
        db "tiles3.bin",0
 
        db PGICONS;12
 
        dw 0xc000
 
        db "icons.bin",0
 
        db PGSPRITES0;13
 
        dw 0xc000
 
        db "sprites0.bin",0
 
        db PGSPRITES1;14
 
        dw 0xc000
 
        db "sprites1.bin",0
 
        db PGSPRTRAN0;15
 
        dw 0xc000
 
        db "sprtran0.bin",0
 
        db PGSPRTRAN1;16
 
        dw 0xc000
 
        db "sprtran1.bin",0
 
        db PGHUD;17
 
        dw 0xc000
 
        db "hud.bin",0
 
hudmsg=0xc000+6144
 
        db PGDAYNIGHT;18
 
        dw 0xc000
 
        db "daynight.bin",0
 
        db -1
 
 
 
        include "../../_sdk/file.asm" 
 
 
 
ARROWS
 
        INCBIN "spr2x2x.C" ;1440 ;стрелки нужны для меню
 
;        ds szARROWS
 
REZULT  ds 192 ;EQU #5802 ;буфер 192 б для маски дня и ночи
 
;в оригинале экран #4000 - линейный буфер
 
 
 
        display "-----",$
 
;=============================================================
 
;=================== 0x6000+
 
 
 
        ds 0x8000-$;IM2-1536-$;ORG IM2-1536
 
        ;INCLUDE "IM2.asm"
 
;IMVEC   EQU ($/256+1)*256;вектор вторых прерываний
 
;START   EQU IMVEC+257 ;старт основной программы
 
 
 
;Основная программа
 
GAME
 
 
 
        LD HL,MUS
 
        LD (IM2Nm2),HL ;иначе хочет рисовать видео
 
        LD HL,1
 
        LD (SPN+1),HL
 
       if SETIM2_TWICE
 
        CALL SETIM2
 
       endif
 
 
 
       if !EGA
 
        CALL BLACK
 
       endif
 
        CALL EXCH ;было обменяно 9000<->c000 на время меню
 
 
 
        ;LD HL,MUSNUM
 
        ;DEC (HL) ;???
 
 
 
NEW_OLDp1=$+1
 
        LD A,0
 
        AND A
 
        PUSH AF
 
        JR NZ,OLD
 
 
 
        LD A,PG_MUZ
 
        CALL PAGE
 
        ;LD HL,VARSPK
 
        ;LD DE,VARS
 
        ;CALL DEHRUST ;теперь грузим в GAMEOVER_MMENU
 
 
 
        LD DE,#4000
 
        PUSH DE,DE
 
       if 1==0
 
        LD A,PG_MISC
 
        CALL PAGE
 
        ld hl,#c000
 
        PUSH DE
 
        LD BC,KSCR-MAPMAS
 
        LDIR 
 
        POP HL
 
        LD DE,#C000
 
        LD A,PG_MAP
 
        CALL PAGE
 
        CALL DEHRUST
 
       else
 
        LD A,PG_MAP
 
        CALL PAGE
 
       endif      
 
 
 
        POP DE
 
        LD HL,DNPK
 
        CALL DEHRUST
 
 
 
        ;LD A,PG_VIEW
 
        CALL PAGE_PG_VIEW
 
        POP HL
 
        LD DE,NG
 
        LD BC,608
 
        LDIR 
 
 
 
OLD     LD A,PG_MAP
 
        CALL PAGE
 
 
 
        CALL INIGAME
 
        LD (FLASH+1),A  ;A<>0
 
 
 
       if EGA
 
        ld a,255 ;нет стрелки
 
        ld (curarrowtype),a
 
        ld de,emptypal
 
        OS_SETPAL
 
        ld e,0+0x80 ;EGA+keep
 
        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 a,1
 
        ld (egaon),a
 
        call clsega ;обработчик прерывания уже порывается рисовать стрелочку!
 
        ;ld de,verapalevening
 
        ;ld de,verapalnight
 
        ;ld de,verapaldawn
 
        ld de,verapalday
 
        OS_SETPAL
 
       endif
 
 
 
        ;LD A,PG_VIEW
 
        CALL PAGE_PG_VIEW
 
       if !EGA
 
        LD HL,VIEW
 
        CALL LC5   ;распак. игр. экран
 
       endif
 
 
 
        LD A,(KARM)
 
        CALL MSK
 
 
 
       if EGA
 
       ;draw HUD
 
        ;ld a,PGHUD
 
        ;call setpg
 
        ld bc,0xc020
 
        ld de,0xc000
 
        ld hl,scrbase+24
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
        call primgega_pghud
 
        ;jr $
 
       ;else
 
       endif
 
        CALL FONE
 
        CALL PRMAP ;Печать видимой части карты на теневом экр.
 
        CALL MOVE  ;Обновл. основн. экрана
 
 
 
        LD A,R
 
        LD (RND+1),A
 
 
 
        CALL MUSNXT
 
 
 
        LD HL,IM2N
 
        LD (IM2Nm2),HL
 
 
 
       if !EGA
 
        ;LD A,16+8
 
        ;CALL CURSCR
 
        call setcurscr1
 
       endif
 
 
 
        POP AF ;NEW_OLDp1
 
        LD A,1
 
        CALL Z,TALK
 
 
 
;Основной цикл
 
MAPING
 
       if EGA
 
        ld a,55
 
        ld (im_swapscr),a
 
       endif
 
MAPINGwait
 
        HALT 
 
MAPINGp2=$+1
 
        LD A,0 ;timer
 
MAPINGp4=$+1
 
        CP FRAME
 
        JR C,MAPINGwait
 
        XOR A
 
        LD (MAPINGp2),A
 
 
 
MAPS    CALL MOVE  ;Обновл. основн. экрана
 
        CALL PRMAP ;Печать видимой части карты на теневом экр.
 
 
 
SPDHERO LD A,SPD_HERO
 
        DEC A
 
        LD (SPDHERO+1),A
 
        JR NZ,CrdHero
 
SPH     LD A,SPD_HERO
 
        LD (SPDHERO+1),A
 
RunHero LD A,0     ;Перемещается ли герой?
 
        AND A
 
        CALL NZ,RUNING
 
CrdHero LD DE,0    ;Текущие координаты героя в пикселях
 
        ;D-Y, E-X
 
SprHero LD HL,hero ;Текущий спрайт героя
 
 
 
        LD A,PG_HERO
 
        CALL PAGE
 
CLR_MAPm2=$+1
 
        CALL HERO ;/HERO2  ;Печать героя на теневом экране
 
CLR_MAPp1=$+1
 
        LD A,0
 
        DEC A
 
        CALL Z,CLMAP ;восстанавливаем карту после заливки (поиска маршрута)
 
MAINLOOP
 
        LD HL,(mouse_crd)
 
        CALL CALC
 
;KEYS
 
        LD A,(KEYSp1)
 
        BIT 5,A
 
        JP NZ,STEAL ;скрытый режим (SS+CS)
 
        BIT 7,A
 
        CALL NZ,TLKNG ;листание диалога (Enter)
 
 
 
        CALL MOVMAP
 
 
 
        LD A,(DIGKp1) ;клавиши "1,2,3,4,5"
 
        CP 31
 
        JR NZ,CHG
 
        XOR A
 
        LD (CHANGE),A
 
CHG     CALL NZ,CHANGE
 
 
 
        LD A,PG_MAP
 
        CALL PAGE
 
        LD A,#FE  ;"C"
 
        IN A,(#FE)
 
        BIT 3,A
 
        CALL Z,CENTR ;герой по центру
 
 
 
;клавиши мыши+колесо
 
MKEYS
 
        LD A,(MKEYSp1)
 
MKEYSp2
 
        LD H,28
 
        RLA 
 
        PUSH AF
 
        CALL C,VLIST ;DWN
 
        DEC H
 
        POP AF
 
        RLA 
 
        PUSH AF
 
        CALL C,VLIST ;UP
 
        POP AF
 
        RLA 
 
        PUSH AF
 
        CALL C,VUSE1 ;правая клавиша
 
        POP AF
 
        RLA 
 
        CALL C,FIRE  ;левая клавиша
 
 
 
MKY     ;LD A,PG_VIEW
 
        CALL PAGE_PG_VIEW
 
 
 
;идет ли диалог?
 
        CALL SCRLMAP
 
DIALOG  LD A,0
 
        DEC A
 
        JP Z,CURS1
 
 
 
;Работа с мешком
 
        LD HL,(mouse_crd) ;H-X,L-Y
 
        CALL BOX ;Выделение кнопки меню
 
        CALL VMESH
 
        JP NZ,CCURS
 
 
 
;Скролл игр.экрана при подведении
 
;курсора к границам экрана
 
        LD BC,#0000
 
        LD D,B
 
        LD E,B
 
;влево
 
;       LD BC,#00FF
 
;       LD DE,#0010
 
 
 
        LD A,H      ;X
 
        AND A
 
        JR NZ,SR
 
        DEC C  ;-1
 
        LD E,16
 
 
 
;вправо
 
;       LD BC,#0001
 
;       LD DE,#00F0
 
 
 
SR      CP MAX_X    ;240
 
        JR C,SD
 
        LD C,1
 
        LD E,-16
 
 
 
;вниз
 
;       LD BC,#0100
 
;       LD DE,#F000
 
 
 
SD      LD A,L      ;Y
 
        CP MAX_Y
 
        JR C,SU
 
        INC B     ;1
 
        LD D,-16
 
 
 
;вверх
 
;       LD BC,#FF00
 
;       LD DE,#1000
 
 
 
SU      AND A
 
        JR NZ,SRUN
 
        LD B,-1
 
        LD D,16
 
 
 
SRUN    LD A,B
 
        OR C
 
        JP Z,CCURS ;экран не двигаем
 
        LD A,2           ;курсор скролла карты
 
 
 
;В зависимости от того в какую сторону
 
;тянем курсор, изменяем смещение карты и коорд. героя
 
 
 
;Проверка на границы карты при скролле
 
;проверка срабатывает и на 0
 
;т.к. при уменьшении 0 получаем 255
 
 
 
SCROLL
 
        EXA 
 
        LD HL,(DispMapX) ;H-Y, L-X
 
        LD A,H
 
        ADD A,B
 
        CP 64-(SCRHG/2-1)
 
        JR C,SL1 ;не вышли за пределы карты
 
        LD B,0
 
        LD D,B
 
        LD A,H
 
SL1     LD H,A
 
        LD A,L
 
        ADD A,C
 
        CP 64-(SCRWD/2-1)
 
        JR C,SL2
 
        LD C,0
 
        LD E,C
 
        LD A,L
 
SL2     LD L,A
 
        PUSH HL
 
 
 
        LD HL,(CrdHero+1)
 
        LD A,H
 
        ADD A,D
 
        LD H,A
 
        LD A,L
 
        ADD A,E
 
        LD L,A
 
        POP DE
 
        EX DE,HL
 
 
 
;Флаг - может ли герой уходить из поля видимости
 
;1-может,0-нет
 
MODscrl LD A,0
 
       if FREESCROLL
 
       ld a,1
 
       endif
 
        AND A
 
        JR NZ,NOBOUND
 
 
 
;Проверка на выход героя из поля видимости
 
;при скролле карты
 
 
 
        LD A,(HEROCRD+1) ;Y героя
 
        DEC A
 
        SUB H
 
        JR C,NOSCRL1
 
        CP SCRHG/2-1
 
        JR C,K4
 
        BIT 7,B
 
        JR Z,K4
 
        LD B,0
 
NOSCRL1 BIT 7,B
 
        JR NZ,K4
 
        LD B,0
 
 
 
K4      LD A,(HEROCRD)   ;X героя
 
        SUB L
 
        JR C,NOSCRL2
 
        CP SCRWD/2
 
        JR C,K3
 
        BIT 7,C
 
        JR Z,K3
 
        LD C,0
 
NOSCRL2 BIT 7,C
 
        JR NZ,K3
 
        LD C,0
 
 
 
K3      LD A,C
 
        OR B
 
        JR Z,CURSR ;не двигаем экран
 
 
 
        LD A,B
 
        AND A
 
        JR NZ,K5
 
        LD A,(DispMapX+1) ;Y
 
        LD H,A
 
        LD A,(CrdHero+2)
 
        LD D,A
 
 
 
K5      LD A,C
 
        AND A
 
        JR NZ,NOBOUND
 
        LD A,(DispMapX)   ;X
 
        LD L,A
 
        LD A,(CrdHero+1)
 
        LD E,A
 
 
 
NOBOUND
 
        LD (DispMapX),HL ;H-Y, L-X
 
        LD (CrdHero+1),DE
 
       if EGA
 
       ld a,3 ;3,2 - печатаем, 1 - не печатаем (кроме как под героем)
 
       else
 
        XOR A
 
       endif
 
        LD (MAPFLAG+1),A ;обновить весь экран
 
 
 
        EXA 
 
        CP 2
 
        JR Z,CURS1p1
 
CURSR   CALL SCRLMAP
 
        JR C,CURS1
 
CCURS   LD A,0      ;Текущий курсор
 
        LD B,A
 
        LD A,(F3+1) ;В мешке ли курсор?
 
        AND A
 
        LD A,(KARM)
 
        JR Z,CURS0  ;Нет
 
        LD B,6      ;курсор руки
 
CURS0   AND A
 
        JR NZ,CURS1p1
 
        LD A,(UNDER+1)
 
        AND A
 
        LD A,6      ;рука (берем предмет)
 
        JR NZ,CURS1p1
 
CURS01  LD A,(DISTP)
 
        AND A
 
        JR Z,CURS1
 
        LD B,5      ;курсор диалога
 
CURS1   LD A,B
 
CURS1p1
 
        CALL MASK   ;Делаем новый спрайт курсора, если нужно
 
 
 
        CALL FTASK
 
 
 
;Конец игры
 
END_G_1=$+1
 
        LD A,1
 
        DEC A
 
        JP NZ,ENDGAME
 
       ;jp ENDGAME
 
        CALL DAY_NGT
 
        CALL VOLCH ;плавное -/+ громкости мелодии
 
REMAP   LD A,0    ;для принудительного обновления экрана
 
        DEC A
 
        JP NZ,MAPING
 
        LD (REMAP+1),A
 
       if EGA
 
       ld a,3 ;3,2 - печатаем, 1 - не печатаем (кроме как под героем)
 
       endif
 
        LD (MAPFLAG+1),A
 
        JP MAPING
 
 
 
;Главное меню игры (мельница)
 
GAMEOVER_MMENU
 
        ld hl,gamemenucolorline
 
        ld (hl),0 ;кнопка меню не активна
 
 
 
        call SETIM1 ;чтобы не включать 2 раза SETIM2
 
       if EGA
 
        ld de,emptypal
 
        OS_SETPAL
 
        
 
        ld de,varsfn
 
        OS_OPENHANDLE
 
        push bc
 
        ld de,VARS
 
        LD hl,0x600
 
        OS_READHANDLE
 
        pop bc ;b=handle
 
        OS_CLOSEHANDLE
 
 
 
        ld a,PG_MAP
 
        call setpg
 
        ld de,mapfn
 
        OS_OPENHANDLE
 
        push bc
 
        ld de,0xc000
 
        LD hl,0x4000
 
        OS_READHANDLE
 
        pop bc ;b=handle
 
        OS_CLOSEHANDLE       
 
 
 
        xor a
 
        ld (curscrnum_int),a
 
        ld e,a
 
        OS_SETSCREEN
 
 
 
        ld e,3+0x80 ;6912+keep
 
        OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
 
        call BLACK
 
        ld de,standardpal
 
        OS_SETPAL
 
        xor a
 
        ld (egaon),a
 
       endif
 
MMENU
 
        DI 
 
;       LD (backsp+1),SP
 
        LD SP,GAMESTACK;#5FFF
 
        LD HL,MUS
 
        LD (IM2Nm2),HL
 
        CALL INIMOUS ;инициализация мышки
 
        CALL BLACK
 
        LD A,255
 
        CALL MUSNXT+3
 
        CALL SETIM2 ;по второму разу не делать!!!
 
        CALL EXCH ;обмен 9000<->c000
 
 
 
        LD A,PG_HERO
 
        CALL PAGE
 
        LD HL,VIDS
 
        LD DE,VIDEOS
 
        CALL DEHRUST ;в 9000
 
SKPMN
 
        CALL VID3 ;инициализация видео?
 
        LD (MMENU2_1),HL
 
        LD (IM2MC),A ;время кадра видео
 
        DEC A
 
        LD (MCM+1),A
 
 
 
        call setpgscr4000
 
 
 
        LD A,PG_MISC
 
        CALL PAGE
 
        LD HL,KSCR
 
        LD DE,#4000
 
        PUSH DE,DE
 
        LD BC,3673
 
        LDIR 
 
 
 
      ;LD A,PG_VIEW
 
        CALL PAGE_PG_VIEW
 
        ;call setpgscr7
 
        ;call setpgc000_shadowscr
 
 
 
        POP HL
 
        CALL LC5
 
        
 
       if EGA
 
        ;ld a,(tpgs+PG_VIEW)
 
        ;SETPG4000
 
        call setpgscr4000_scr2
 
        ld hl,0xc000
 
        ld de,0x4000
 
        ld bc,6912
 
        ldir
 
 
 
        call setpgscr4000
 
       endif
 
 
 
        HALT 
 
        DI 
 
        LD B,5
 
MMLP    PUSH BC
 
        CALL VIDEO
 
        POP BC
 
        DJNZ MMLP
 
        EI 
 
 
 
        LD HL,#C000
 
        POP DE
 
        LD BC,6912
 
        LDIR 
 
 
 
        call setpgmain4000
 
 
 
        XOR A
 
        CALL MSK
 
        CALL ARRON
 
 
 
        ;LD A,16+8
 
MMENUS  ;CALL CURSCR
 
        call setcurscr1
 
 
 
        LD HL,IM2MEN
 
        LD (IM2Nm2),HL
 
 
 
        LD IX,MNKEYS2
 
        LD DE,#0905
 
        LD HL,#5878
 
        LD BC,#0B15
 
        LD A,E
 
 
 
        CALL MCYCL ;цикл работы меню, выход по enter
 
 
 
        LD HL,NEW_OLDp1
 
        DEC C
 
        LD (HL),C
 
        JP Z,GAME ;новая игра
 
        DEC C
 
        JR Z,OGM  ;старая игра
 
        DEC C
 
        JR Z,ABOUT;об игре
 
        DEC C,C
 
        JP Z,EXIT
 
 
 
ABOUT
 
        PUSH BC
 
 
 
        LD HL,MUS
 
        LD (IM2Nm2),HL
 
 
 
        ;LD A,16+8
 
        ;CALL CURSCR
 
        call setcurscr1
 
        ;LD A,PG_MISC
 
        ;CALL PAGE
 
        ;LD HL,ABOUTS
 
        ;LD DE,#4000
 
        ;CALL DEHRUST
 
        POP BC
 
        LD D,1
 
        CALL PRINTER;#4000
 
        CALL BLACK
 
        JP SKPMN
 
 
 
OGM     ;CALL SETIM1
 
        JP LOAD ;-> GAME
 
 
 
;На строку ниже в экранном файле
 
LINE_HL INC     H
 
        LD      A,H
 
        AND     7
 
        RET     NZ
 
        LD      A,L
 
        ADD     A,32
 
        LD      L,A
 
        RET     C
 
        LD      A,H
 
        SUB     8
 
        LD      H,A
 
        RET 
 
 
 
DIV32   SRL H,L
 
DIV16   SRL H,L
 
DIV8    SRL H
 
        SRL H
 
        SRL H
 
        SRL L
 
        SRL L
 
        SRL L
 
        RET 
 
 
 
;Установка вектрора IM2
 
       if INT_IM2
 
SETIM2
 
        DI 
 
        LD HL,IMVEC ;адрес вектора прерываний
 
        LD BC,256
 
        LD D,H
 
        LD E,B
 
        LD (HL),IM2/256
 
        LD A,H
 
        LDIR 
 
        LD I,A
 
        IM 2
 
        EI 
 
        RET 
 
       else
 
SETIM2=swapimer
 
       endif
 
 
 
SETIM1
 
        DI 
 
        ;LD A,(PG_+1)
 
        ;LD (SCRNUM+1),A ;???
 
        LD A,PG_MUZ
 
        CALL PAGE
 
        CALL MUTE
 
        ;LD A,16+8
 
        ;CALL CURSCR
 
        call setcurscr1
 
        LD A,PG_MISC
 
        CALL PAGE
 
       if INT_IM2
 
        LD IY,23610
 
        LD A,63
 
        LD I,A
 
        IM 1
 
       else
 
        call swapimer
 
       endif
 
        EI 
 
        ;LD HL,LODSAV
 
        ;LD DE,LOAD
 
        ;LD BC,LENLS
 
        ;LDIR 
 
        RET
 
 
 
;Игровое меню
 
GMEN
 
       if EGA
 
        LD A,(gamemenucolorline);(#DAD9) ;где-то в атрибутах
 
        CP 56+64
 
        RET NZ
 
 
 
        xor a
 
        ld (curarrowtype),a
 
 
 
        LD HL,SND_SPK
 
        LD (SAMPLE+1),HL
 
 
 
        POP HL ;для коррекции SP
 
        POP HL
 
 
 
        ld bc,0x0834
 
        ld de,hudmenuofft
 
        ld hl,scrbase+(5*8*40)+6
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
        call primgega_pgdaynight
 
 
 
        ld de,hudmenuoff0
 
        ld hl,scrbase+(6*8*40)+6
 
        ld bc,0x1834
 
        call primgega_pgdaynight
 
        ld de,hudmenu0
 
        ld hl,scrbase+(6*8*40)+7
 
        ld bc,0x182c
 
        call primgega_pgdaynight
 
        ld de,hudmenuoff1
 
        ld hl,scrbase+(9*8*40)+6
 
        ld bc,0x1834
 
        call primgega_pgdaynight
 
        ld de,hudmenuoff2
 
        ld hl,scrbase+(12*8*40)+6
 
        ld bc,0x1834
 
        call primgega_pgdaynight
 
 
 
        ld bc,0x1034
 
        ld de,hudmenuoffb
 
        ld hl,scrbase+(15*8*40)+6
 
        call primgega_pgdaynight
 
        
 
       else
 
;      LD A,PG_VIEW
 
        CALL PAGE_PG_VIEW
 
        LD A,(gamemenucolorline);(#DAD9) ;где-то в атрибутах
 
        CP 56+64
 
        RET NZ
 
 
 
        LD HL,SND_SPK
 
        LD (SAMPLE+1),HL
 
 
 
        POP HL ;для коррекции SP
 
        POP HL
 
 
 
        XOR A
 
        CALL MASK
 
 
 
;Вывод меню
 
        LD HL,SPRMENU
 
        LD DE,#C0A6
 
        LD A,12*8 ;высота
 
MN2     EX AF,AF' ;'
 
        PUSH DE
 
        LD C,13   ;ширина
 
        LDI 
 
        JP PE,$-2
 
        POP DE
 
        EX DE,HL
 
        CALL LINE_HL
 
        EX DE,HL
 
        EX AF,AF' ;'
 
        DEC A
 
        JR NZ,MN2
 
 
 
;Раскрашивание
 
 
 
        LD HL,#D8A6
 
        LD E,12
 
        LD A,FILAT
 
        LD C,19
 
FIL     LD B,13
 
        LD (HL),A
 
        INC L
 
        DJNZ $-2
 
        ADD HL,BC
 
        DEC E
 
        JR NZ,FIL
 
 
 
        LD A,#68
 
        LD H,A
 
        LD L,A
 
        LD (#D8A6),HL
 
        LD (#D8B1),HL
 
        LD (#DA0B),HL
 
        LD (#DA0D),A
 
        LD (#DA06),A
 
        LD (#DA12),A
 
       endif
 
 
 
        XOR A
 
        LD (MCM+1),A
 
 
 
        LD IX,MNKEYS ;структура выделения пунктов
 
        LD DE,#0B04
 
        LD HL,FILAT2+(FILAT*256)
 
        LD BC,#0B15
 
        LD A,3
 
        CALL MCYCL
 
        DEC C
 
        JR Z,GAM
 
        DEC C
 
        JP NZ,GAMEOVER_MMENU
 
SAV     ;CALL SETIM1
 
        JP SAVE
 
 
 
       if 1==0
 
ERROR
 
        CALL ERR
 
      ;LD A,PG_VIEW
 
        CALL PAGE_PG_VIEW
 
        LD HL,#D800
 
        LD DE,#5800
 
        LD BC,768
 
        LDIR 
 
        CALL SETIM2
 
;SCRNUM  LD A,0
 
        JP MMENUS
 
 
 
ERROR2
 
        CALL ERR
 
       endif
 
        
 
SAVE_OK ;CALL SETIM2
 
;      LD A,PG_VIEW
 
        CALL PAGE_PG_VIEW
 
 
 
GAM     CALL FONE
 
        XOR A
 
        LD H,A
 
        LD L,A
 
        CALL BOX ;Выделение кнопки меню
 
        JP REMAP+6
 
 
 
;Работа в меню
 
;OUT: C-номер выбранного пункта меню (1-X)
 
MCYCL
 
;a=количество пунктов
 
;l=атрибут кнопки
 
;h=атрибут окна
 
;b=ширина пункта
 
;c=приращение для перехода на следующую строку
 
        LD (MENLP-1),A  ;кол-во пунктов
 
        LD (SCANMOD+1),A
 
        LD A,L
 
        LD (MN_V1+1),A  ;атриб. кнопки
 
        LD A,H
 
        LD (MN_V2+1),A  ;атриб. окна
 
        LD A,B
 
        LD (MN_V3+1),A  ;ширина пункта
 
        LD A,C
 
        LD (MN_V4+1),A  ;приращение
 
 
 
       if EGA
 
       xor a ;несуществующий пункт
 
       ld (oldmenuoption),a
 
       endif
 
        LD A,1
 
        LD (SETCURp1),A ;текущий пункт меню - верхний
 
 
 
;Цикл опроса кнопок
 
MNLOOP  PUSH IX,IX,DE
 
        HALT 
 
MCM     LD A,0
 
        AND A
 
        DI 
 
        CALL NZ,MMENU2 ;show anim and arrow
 
        EI 
 
        POP DE,IX
 
        CALL PUNKT
 
       if EGA
 
        ld hl,(egaon)
 
        dec l
 
        jr nz,MNLOOPnoega
 
oldmenuoption=$+1
 
       cp 0 ;бывший текущий пункт меню
 
       jr z,MNLOOPnodraw ;не перерисовывать, если текущий пункт не менялся
 
       ld (oldmenuoption),a
 
MNLOOPnoega
 
       endif
 
        EXA 
 
        LD C,1
 
        LD A,3      ;кол-во пунктов в меню
 
MENLP   EXA 
 
        SUB 3
 
        CALL MNLOCK
 
        INC C
 
        EXA 
 
        DEC A
 
        JR NZ,MENLP
 
MNLOOPnodraw
 
        POP IX
 
        DEC C
 
        LD HL,MKEYSp1
 
 
 
        LD A,(HL)
 
        AND %00010000
 
        LD B,A
 
        LD A,(HL)
 
        AND %11000000 ;колесо мышки
 
 
 
        BIT 5,(HL)    ;правую клавишу мышки
 
        JR Z,$+3      ;делаем аналогом
 
        SCF           ;ENTER
 
 
 
        RRA 
 
        OR B
 
        LD B,A
 
        LD A,(KEYSp1)
 
        AND %11100000
 
        OR B
 
 
 
        LD (HL),0
 
 
 
        ADD A,A     ;7-й бит (ENTER)
 
        JR C,FIR_K
 
        LD B,1
 
        ADD A,A     ;6-й  вниз
 
        JR C,CDWN
 
        ADD A,A     ;5-й  вверх
 
        JR C,CDWN-3
 
        ADD A,A     ;4-й  огонь
 
        JR C,FIR_M
 
        LD A,FRM
 
        JR CDU
 
        LD BC,#FF01
 
;Вверх/вниз по меню
 
CDWN    LD A,FRM
 
        DEC A
 
        JR Z,CDWUP
 
CDU     CP FRM-1
 
        LD (CDWN+1),A
 
        JR NZ,MNLOOP
 
CDWUP   LD HL,SETCURp1
 
        LD A,(HL)
 
        CP C
 
        JR Z,MNLOOP
 
        ADD A,B
 
        LD (HL),A
 
        JR MNLOOP
 
 
 
;OUT: B-текущий пункт
 
;     CY-курсор не на пункте
 
;    NC-на пункте
 
PUNKT
 
        LD HL,(mouse_crd)
 
        CALL DIV8
 
        LD A,H      ;X
 
        SUB 7
 
        CP D        ;D=ширина области
 
        JP NC,SETCUR
 
PN1     LD BC,0
 
        LD (PN1+1),HL
 
        XOR A
 
        SBC HL,BC
 
        JP Z,SETCUR
 
        ADD HL,BC
 
        LD A,L      ;Y
 
        SUB E
 
        JP DIV3
 
 
 
;Нажали огонь в меню мышкой/курсором
 
FIR_M   ;XOR A
 
        ;LD (HL),A
 
        LD (PN1+1),HL ;специально принуждаем неравенство
 
       ;jr $
 
        CALL PUNKT ;OUT: B-текущий пункт
 
        JP C,MNLOOP ;если курсор не на пункте меню, то MNLOOP
 
        LD A,(SETCURp1)
 
        CP B
 
        JP NZ,MNLOOP
 
 
 
;Кнопка выбрана (Enter)
 
FIR_K   LD HL,SND_NXT
 
        LD (SAMPLE+1),HL
 
        LD A,(SETCURp1)
 
        LD C,A
 
        XOR A
 
        LD (SCANMOD+1),A
 
        RET 
 
 
 
;Выделение пунктов
 
MNLOCK
 
        PUSH AF
 
        PUSH BC
 
        PUSH DE
 
        PUSH IX
 
MN_V2   LD B,FILAT ;атриб. невыделенного пункта
 
        JR NZ,MN_V1_ok
 
        LD A,C
 
        LD (SETCURp1),A ;текущий пункт меню - выделенный рисуемый
 
 
 
MN_V1   LD B,FILAT2 ;атриб. выделения
 
MN_V1_ok
 
       if EGA
 
        ld a,(egaon)
 
        rrca
 
        jr nc,MN_noega;MNEND
 
       
 
        ld a,b
 
        cp FILAT ;атриб. невыделенного пункта
 
        jr z,MN_unselect
 
        
 
        ld de,hudmenu2
 
        ld hl,scrbase+(12*8*40)+7
 
       dec c
 
       jr nz,$+5+3
 
        ld de,hudmenu0
 
        ld hl,scrbase+(6*8*40)+7
 
       dec c
 
       jr nz,$+5+3
 
        ld de,hudmenu1
 
        ld hl,scrbase+(9*8*40)+7
 
        ld bc,0x182c
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
        call primgega_pgdaynight
 
        jr MNEND
 
MN_unselect
 
        ld de,hudmenuoff2
 
        ld hl,scrbase+(12*8*40)+6
 
       dec c
 
       jr nz,$+5+3
 
        ld de,hudmenuoff0
 
        ld hl,scrbase+(6*8*40)+6
 
       dec c
 
       jr nz,$+5+3
 
        ld de,hudmenuoff1
 
        ld hl,scrbase+(9*8*40)+6
 
        ld bc,0x1834
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
        call primgega_pgdaynight
 
        jr MNEND
 
MN_noega
 
       endif
 
        LD E,(IX)
 
        LD D,(IX+1)
 
        LD A,(DE)  ;если кнопка уже выкрашена, то не красим
 
        CP B
 
        JR Z,MNEND
 
        LD A,B
 
        LD C,3    ;высота строки выделения
 
MNLP0   LD H,(IX+2)
 
        LD L,(IX+3)
 
MN_V3   LD B,11
 
MNLP1   ADD HL,HL
 
        JR NC,MNLP
 
        LD (DE),A
 
MNLP    INC DE
 
        DJNZ MNLP1
 
MN_V4   LD HL,21
 
        ADD HL,DE
 
        EX DE,HL
 
        INC IX,IX
 
        DEC C
 
        JR NZ,MNLP0
 
MNEND   POP IX
 
        LD BC,8
 
        ADD IX,BC
 
        POP DE
 
        POP BC
 
        POP AF
 
        RET 
 
 
 
;Выделение кнопки меню
 
BOX
 
        PUSH HL
 
        CALL DIV8
 
        LD BC,#0638
 
        LD A,L
 
        CP 22
 
        JR NZ,BX1
 
        LD A,H
 
        CP 25
 
        JR C,BX1
 
        LD C,56+64
 
BX1
 
        LD HL,gamemenucolorline;#DAD9
 
        LD A,(HL)
 
        CP C
 
        JR Z,BX2
 
        LD (HL),C
 
        INC L
 
        DJNZ $-2
 
       if EGA
 
        ;ld a,(egaon)
 
        ;or a
 
        ;ret nz ;TODO?
 
        ld a,c
 
        cp 56+64
 
        ld de,menuline0
 
        jr nz,$+5
 
        ld de,menuline1
 
        ld hl,scrbase+(176*40)+25
 
        ld bc,0x0818
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
        call primgega_pghud
 
        
 
       endif
 
BX2     POP HL
 
        RET 
 
 
 
MNKEYS  DW #D8C7
 
        DB %11100001,%10000000
 
        DB %11111111,%11100000
 
        DB %11000000,%01100000
 
 
 
        DW #D927
 
        DB %11000001,0
 
        DB %11111111,%11100000
 
        DB %00110000,%11100000
 
 
 
        DW #D987
 
        DB %11100001,0
 
        DB %11111111,%11100000
 
        DB %00010000,%11100000
 
 
 
MNKEYS2
 
        DW #D8E8
 
        DB %11101100,0
 
        DB %11111111,0
 
        DB %00110010,0
 
 
 
        DW #D947
 
        DB %11000110,0
 
        DB %11111111,128
 
        DB %00111001,0
 
 
 
        DW #D9A8
 
        DB %11111000,0
 
        DB %11111110,0
 
        DB %00000100,0
 
 
 
        DW #DA07
 
        DB %11111100,0
 
        DB %11111111,#C0
 
        DB %00000011,0
 
 
 
        DW #DA6A
 
        DB %10011000,0
 
        DB %11111000,0,0,0
 
 
 
;Конец игры
 
ENDGAME
 
       if EGA
 
        ld e,3+0x80 ;6912+keep
 
        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 de,emptypal;standardpal
 
        OS_SETPAL
 
        xor a
 
        ld (egaon),a
 
        inc a
 
        ld (curscrnum_int),a
 
        ld e,a
 
        OS_SETSCREEN
 
       endif
 
        DI 
 
        LD A,PG_MUZ
 
        CALL PAGE
 
        CALL MUTE
 
;       CALL BLACK
 
        xor a
 
        ld (MUSONp1),a ;fix (Sergio)
 
 
 
        LD A,PG_MISC
 
        CALL PAGE
 
        LD HL,FINAL
 
        LD DE,#4000
 
        PUSH DE
 
        LD BC,FINLEN
 
        LDIR 
 
        RET 
 
 
 
;Выход в ассемблер/Бейсик
 
EXIT
 
        EI 
 
        HALT 
 
        DI 
 
         call swapimer
 
        ;LD A,16
 
        ;LD (PG_+1),A ;???
 
        LD A,PG_MUZ
 
        CALL PAGE
 
        CALL MUTE
 
        IM 1
 
        EI 
 
        ld hl,0 ;result
 
        QUIT
 
 
 
;Герой перемещается по карте.
 
;Устанавливаем в какую сторону.
 
RUNING
 
        JR COUNT1 ;JR ROTATE команды меняются когда идет поворот
 
COUNT1  LD A,0  ;счетчик шагов героя
 
        INC A
 
        CP 4
 
        JR C,RH1
 
        XOR A
 
RH1     LD (COUNT1+1),A
 
        EX AF,AF' ;'
 
 
 
VUS     LD A,0
 
        AND A
 
        JP NZ,VUSE3     ;вещи
 
 
 
COUNT2  LD A,0  ;еще счетчик полного перемещения
 
                ;из одной клетки в другую (он=16 т.к. карта
 
                ;построена из клеток 2*2 знакоместа)
 
        INC A
 
        CP 16/STEPS
 
        JR C,RH2
 
        XOR A
 
RH2     LD (COUNT2+1),A
 
        CALL Z,NxtStep
 
        LD HL,(CrdHero+1) ;H-Y, L-X
 
NAPRAVL LD BC,0 ;приращение по направлению
 
        LD A,H
 
        DUP STEPS
 
        SUB B   ;изменение координат на опред. кол-во пикселей
 
        EDUP 
 
        LD H,A
 
        LD A,L  ;Расчет новых координат
 
        DUP STEPS
 
        SUB C   ;в зависимости
 
        EDUP 
 
        LD L,A  ;от направления движения героя
 
        LD (CrdHero+1),HL ;H-Y, L-X
 
 
 
;Из группы одного направления героя (напрвлений всего 8)
 
;выбираем 1 из 4 спрайтов в зависимости от 1-го счетчика шагов
 
SPRHERO LD HL,Right
 
        INC HL
 
        EX AF,AF' ;'
 
        ADD A,A
 
        LD C,A
 
        LD B,0
 
        ADD HL,BC
 
SH1     LD C,(HL)          ;BC=адрес нужного спрайта
 
        INC HL
 
        LD B,(HL)
 
        LD (SprHero+1),BC
 
        RET 
 
 
 
;Поворот героя, т.е. смена его направления
 
ROTATE  LD A,2 ;Из какого направления, сначала Вера стоит вправо
 
Prev    LD B,2 ;в какое направление нужно придти
 
RotMod  NOP    ;в какую сторону вертимся (INC A/DEC A)
 
        CP 255
 
        JR NZ,R1
 
        LD A,7
 
R1      CP 8
 
        JR C,R2
 
        XOR A
 
R2      LD (ROTATE+1),A
 
        CP B
 
        LD B,A
 
        JR NZ,R3
 
        XOR A            ;Если предыд. значение направления
 
        LD (RUNING+1),A  ;и настоящее стали равны,
 
R3      LD A,B           ;значит поворот закончен
 
        ADD A,A
 
;Выбираем из таблички нужный спрайт и печатаем его
 
        LD HL,RotTabl
 
        LD C,A
 
        LD B,0
 
        ADD HL,BC
 
        JR SH1
 
;H-y, L-x
 
;Расчитываем следующий шаг, а так же направление героя
 
NxtStep
 
        LD A,PG_MAP
 
        CALL PAGE
 
 
 
PATHadr LD HL,0    ;Путь содержит направления
 
                   ;по которым перемещается герой
 
        LD A,(HL)  ;Направление
 
        LD B,A
 
        INC A
 
        JP Z,EndStep      ;если A=255, то герой достиг цели!
 
        DEC HL
 
        LD (PATHadr+1),HL ;запоминаем адрес след. направл.
 
        LD A,(HL)
 
        LD (OLDpath),A
 
 
 
        LD A,B
 
        LD D,B
 
        CALL NAPR
 
        LD (NAPRAVL+1),BC ;Сохраняем приращение по направлению
 
        LD HL,(HEROCRD)
 
        LD A,H
 
        SUB B
 
        LD B,D
 
        LD D,A
 
        LD A,L  ;Расчет новых координат
 
        SUB C   ;в зависимости
 
        LD E,A  ;от направления движения героя
 
 
 
        LD A,B
 
ROTAT   LD HL,VeraTab
 
        ADD A,A     ;A=A*9
 
        ADD A,A
 
        ADD A,A
 
        ADD A,B
 
        LD C,A
 
        LD B,0
 
        ADD HL,BC ;HL=адресу таблицы группы спрайтов
 
        LD B,(HL)
 
 
 
        LD A,(ROTATE+1) ;Предыдущее направление героя
 
        LD C,A
 
        CP B
 
        JR NZ,ROT
 
INIT    LD (SPRHERO+1),HL
 
        LD (HEROCRD),DE
 
        RET 
 
 
 
;в какую сторону вертеться
 
ROT     AND A
 
        LD A,B
 
        JR Z,P1
 
        LD A,C
 
        SUB B
 
        JR NC,P2
 
        NEG 
 
 
 
P1      CP 5
 
        JR C,P0-2
 
        LD E,#3D ;DEC A
 
        JR P0
 
 
 
P2      CP 5
 
        LD E,#3D ;DEC A
 
        JR C,P0
 
        LD E,#3C ;INC A
 
 
 
P0      LD A,ROTATE-RUNING-2 ;изменяем код JR
 
        LD (RUNING+1),A
 
;        LD A,E
 
;P3      XOR 0       ;0/1 для колдовства Зловетом
 
       ld a,(P3p1) ;0/1 для колдовства Зловетом
 
       xor e
 
        LD (RotMod),A
 
 
 
        LD A,B
 
        LD (Prev+1),A
 
 
 
        LD HL,(PATHadr+1)
 
        INC HL
 
        CALL ES2
 
        POP HL  ;лишний POP для выхода из NextStep
 
        JP ROTATE
 
 
 
;Это был последний шаг. Герой достиг цели!
 
EndStep
 
        POP AF ;лишний POP для выхода из процедуры NxtStep
 
        XOR A
 
        LD (RunHero+1),A
 
        LD (FTASK),A
 
ES2     LD (PATHadr+1),HL
 
        LD A,STEP1
 
        LD (COUNT2+1),A
 
        LD A,STEP2
 
        LD (COUNT1+1),A
 
        RET   ;Выход из процедуры RUNING
 
 
 
;Приводим абсолютные координаты героя
 
;в пиксельные для печати на экране
 
;H-Y, L-X
 
Abs_Pix LD HL,(HEROCRD) ;координаты ног героя на карте
 
        LD A,H
 
        ADD A,A ;A=A*16
 
        ADD A,A
 
        ADD A,A
 
        ADD A,A
 
        SUB 16  ;т.к. нам нужно получить координаты головы героя
 
        LD H,A
 
 
 
        LD A,L
 
        ADD A,A ;A=A*16
 
        ADD A,A
 
        ADD A,A
 
        ADD A,A
 
        LD L,A
 
        RET 
 
 
 
;курсор вне мешка
 
VNE     LD A,(F3+1)
 
        AND A
 
        RET Z
 
        XOR A
 
        LD (F3+1),A
 
VNE2    LD A,(PRTIME+1)
 
        AND A
 
        RET NZ
 
        LD (CLT+1),A
 
        CPL 
 
        LD (SVER+1),A
 
        RET 
 
 
 
;выбор вещи курсором из мешка
 
VMESH
 
        LD A,H      ;X
 
        CP MAX_X
 
        JR NC,VNE
 
        SUB 200
 
        JR C,VNE
 
        CALL DIV24 ;b=A/24
 
        LD A,B
 
        CP 2
 
        JR NC,VNE
 
        LD D,A ;X
 
        LD A,L      ;Y
 
        CP 30
 
        JR C,VNE
 
        CP 94
 
        JR NC,VNE
 
        SUB 28
 
        JR C,VNE
 
        CALL DIV24 ;b=A/24
 
        LD A,B
 
        CP 3
 
        JR NC,VNE
 
 
 
        ADD A,A;Y
 
        ADD A,D
 
        LD E,A
 
        LD D,0
 
 
 
        LD HL,(MSTRT+2)
 
        ADD HL,DE
 
        LD (VADR+1),HL;адрес вещи на которой стоит курсор
 
        LD A,1
 
        LD (F3+1),A   ;курсор в мешке!
 
 
 
        LD B,(HL);номер вещи из мешка на кот. стоит курсор
 
 
 
;печать названия вещи:A-код вещи
 
PRVESH
 
        LD A,(PRTIME+1)
 
        AND A
 
        RET NZ
 
 
 
;Чтобы одно и тоже название не печаталось дважды
 
SVER    LD A,255 ;предыд. вещь на котор. стоял курсор
 
        CP B
 
        JR Z,SV2
 
        LD A,B
 
        LD (SVER+1),A
 
 
 
        ADD A,A
 
        LD E,A
 
        LD D,0
 
        LD HL,V
 
        ADD HL,DE
 
        LD E,(HL)
 
        INC HL
 
        LD D,(HL) ;DE-название вещи
 
        LD (PRT+3),DE
 
        XOR A
 
        LD (CLT+1),A
 
        LD (PRT+1),A
 
SV2     INC A
 
        RET 
 
 
 
;Стирание области под текстом
 
CLADR=#C8D9
 
CLADR2=#C8F9
 
 
 
CLTXT
 
;in IM2
 
       if EGA
 
        ld hl,scrbase+(40*112)+#19
 
        ld bc,0x1018
 
        ld e,0x3f ;color 7 ;0xc9 ;color 9
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
        jp climgega
 
       else
 
        LD HL,0
 
        DUP 8
 
        LD (CLADR),HL
 
        LD (CLADR+2),HL
 
        LD (CLADR+4),HL
 
CLADR=CLADR+256
 
        EDUP 
 
 
 
        DUP 8
 
        LD (CLADR2),HL
 
        LD (CLADR2+2),HL
 
        LD (CLADR2+4),HL
 
CLADR2=CLADR2+256
 
        EDUP 
 
        RET 
 
       endif
 
 
 
;Увеличение скорости обновления экрана
 
;Заметно ТОЛЬКО в режиме Турбо компьютера
 
TURBO
 
        LD HL,MAPINGp4
 
        LD A,FRAME
 
        DEC (HL)
 
        JR Z,$+4
 
        LD A,1
 
        LD (HL),A
 
        JR KOF
 
 
 
;скрытый режим
 
STEAL
 
        LD A,(CHANGE)
 
        AND A
 
        JP NZ,KOF
 
 
 
        LD A,#FB
 
        IN A,(#FE) ;SS/CS+T
 
        BIT 4,A
 
        JR Z,TURBO
 
 
 
        LD H,27
 
        LD A,#F7
 
        IN A,(#FE) ;SS/CS+3/4-листание вверх/вниз
 
        BIT 2,A
 
        JR Z,VLST
 
        INC H
 
        BIT 3,A
 
        JR Z,VLST
 
        BIT 0,A
 
        JP Z,SKIP  ;промотка диалога
 
 
 
        LD A,#BF
 
        IN A,(#FE)  ;SS/CS+J/K - перелет героя - J
 
                    ;границы скролла - K
 
        AND 12
 
        CP 12
 
        JR Z,RMOUS
 
        BIT 2,A
 
        JR Z,BORDER
 
 
 
        LD A,(RunHero+1)
 
        AND A
 
        JR NZ,RMOUS
 
 
 
STPIN   LD A,0
 
        INC A
 
        CP 8
 
        JR C,STN1
 
        XOR A
 
STN1    LD (STPIN+1),A
 
        ADD A,A
 
        LD HL,CRDJP
 
        LD E,A
 
        LD D,0
 
        ADD HL,DE
 
        LD E,(HL)
 
        INC HL
 
        LD D,(HL)
 
        LD (HEROCRD),DE
 
STN2    LD A,PG_MAP
 
        CALL PAGE
 
        CALL CENTR2
 
        JR KOF
 
RMOUS   LD A,32    ;имит. прав. клавишу мыши
 
        JP MKEYSp2
 
 
 
CRDJP   DW #3906 ;Домой
 
        DW #0537 ;к Зловету
 
        DW #2F1B ;к Аленушке
 
        DW #3236 ;к Хевору
 
        DW #2807 ;к Петро
 
        DW #1908 ;к Кузнецу
 
        DW #0407 ;к Фекле;
 
        DW #1E32 ;к библиотекарю
 
 
 
;Удаление границ скроллир. карты (герой может уходить за экран)
 
BORDER  LD A,(MODscrl+1)
 
        XOR 1
 
        LD (MODscrl+1),A
 
        JR KOF
 
 
 
;Листание вещей от клавиш
 
VLST
 
        CALL VLIST
 
KOF     LD A,201
 
        LD (CHANGE),A
 
        JP MKY
 
 
 
;Изменение каких-либо параметров от клавиш
 
CHANGE
 
        NOP ;RET
 
        EX AF,AF' ;'
 
        LD A,201
 
        LD (CHANGE),A
 
        EX AF,AF' ;'
 
        RRA 
 
        JR NC,MUS_ONOF ;"1"
 
        RRA 
 
        JR NC,SNDONOF  ;"2"
 
        RRA 
 
        RET C
 
;Вкл/откл мышки - клавиша "3"
 
MS_ONOF LD HL,mouse+1
 
        LD A,(HL)
 
        CPL 
 
        LD (HL),A
 
        RET 
 
 
 
;Вкл/откл звуков
 
SNDONOF LD A,PG_MAP
 
        CALL PAGE
 
        LD HL,SOUND
 
        LD A,201
 
        XOR (HL)
 
        LD (HL),A
 
        LD HL,SND_TSK
 
        LD (SAMPLE+1),HL
 
        CALL NZ,AY_OFF
 
        RET 
 
 
 
;Вкл/откл музыки
 
MUS_ONOF
 
        HALT 
 
        LD A,(MUSONp1)
 
        XOR 1
 
        LD (MUSONp1),A
 
        DI 
 
        LD A,PG_MUZ
 
        CALL PAGE
 
        CALL MUTE
 
        EI 
 
        RET 
 
 
 
;Изменение громкости мелодии
 
VOLCH
 
        LD B,#FF
 
        NOP 
 
        LD A,PG_MUZ
 
        CALL PAGE
 
        LD HL,VOLUME
 
        LD A,(HL)
 
        ADD A,B
 
        CP -16
 
        JR Z,MUSNXT
 
        CP 1
 
        JR Z,STPVOL
 
        LD (HL),A
 
        RET 
 
 
 
STPVOL  LD HL,#C9FF
 
        LD (VOLCH+1),HL
 
        RET 
 
 
 
MUSNXT2 XOR A
 
        LD (VOLCH+2),A
 
        RET 
 
 
 
;Переход на след. мелодию
 
MUSNXT
 
        LD A,(MUSNUM)
 
        LD B,A
 
        LD A,PG_MUZ
 
        CALL PAGE
 
        LD A,B
 
        INC A
 
        CP 6   ;кол-во мелодий
 
        JR C,$+3
 
        XOR A
 
        LD (MUSNUM),A
 
        LD HL,MUSTAB
 
        ADD A,A
 
        LD E,A
 
        LD D,0
 
        ADD HL,DE
 
        LD E,(HL)
 
        INC HL
 
        LD D,(HL)
 
        EX DE,HL
 
        LD DE,MUSIC
 
        CP 10
 
        JR NZ,$+5
 
        LD DE,#C000
 
        PUSH DE
 
        EI 
 
        HALT 
 
        CALL DEHRUST
 
        POP HL
 
        LD DE,100
 
        AND A
 
        SBC HL,DE
 
        DI 
 
        CALL PLAY ;инициал. мелод.
 
        EI 
 
        LD HL,#0001
 
        JR STPVOL+3
 
 
 
MUSTAB  DW MUSM,MUS0,MUS1,MUS2,MUS3,MUSF
 
 
 
CLRMK   XOR A
 
        LD (MKEYSp1),A
 
        RET 
 
FIRE
 
        CALL CLRMK
 
        CALL GMEN
 
        LD A,(DIALOG+1) ;открыто ли окно диалога?
 
        AND A
 
        JP NZ,TALKING
 
 
 
;использование вещей
 
F3      LD A,0      ;если не ноль, то курсор в мешке
 
        AND A
 
        JR Z,F4
 
VADR    LD HL,0
 
        LD A,(KARM) ;если вещей в руке нет, значит берем
 
        LD D,(HL)
 
        AND A
 
        JR NZ,VA1
 
        OR D
 
        RET Z
 
        XOR A
 
        JR F32      ;берем вещь
 
VA1     SUB 7
 
        DEC D
 
        INC D
 
        JR Z,F31    ;ложим
 
 
 
;применяем вещь на вещь в мешке
 
        PUSH HL
 
        CALL SVOYST
 
        POP HL
 
        INC BC
 
        LD A,(BC)
 
        CP D
 
        JP NZ,NOTUSE ;нельзя применить
 
        INC BC
 
        LD A,(BC)
 
        CALL F31
 
        XOR A
 
        LD (F3+1),A
 
        INC BC
 
        LD A,(BC)
 
 
 
        LD HL,SND_OBJ
 
        LD (SAMPLE+1),HL
 
        JP TLSN
 
 
 
F31     LD D,-7
 
F32     LD (HL),A
 
        LD A,D
 
        ADD A,7
 
        LD (KARM),A
 
        LD (CCURS+1),A
 
        LD HL,INV+1 ;напеч. спрайты 3*3
 
        INC (HL)
 
        LD HL,SND_TK
 
        LD (SAMPLE+1),HL
 
        RET 
 
 
 
F4      LD A,(VUS+1)
 
        AND A
 
        RET NZ
 
 
 
        CALL MANAGE
 
        LD A,B
 
        AND A
 
        JR Z,F41
 
        CP 5
 
        JP NZ,VUSE2
 
 
 
F41     LD HL,(mouse_crd);L-y,H-x
 
        CALL DIV8
 
        LD A,H ;X
 
        CP 24
 
        JR C,F5
 
        LD A,L ;Y  ;листание вещей в мешке
 
        CP 3
 
        RET NZ
 
VLIST
 
        CALL CLRMK
 
        LD A,H
 
        LD HL,(MSTRT+2)
 
        LD DE,6       ;шаг листания вещей: 1 вещь-1 байт
 
        LD BC,MESHOK
 
        SUB 27
 
        JR Z,VESHUP ;вверх
 
        DEC A
 
        JP Z,VESHDW ;вниз
 
;reter
 
        RET 
 
 
 
jpix
 
        jp (ix)
 
 
 
;нажали огонь на игровом поле
 
PATH
 
F5      SRL H ;X
 
        SRL L ;Y
 
 
 
        LD (FTSK+1),HL
 
 
 
;MG1     CALL MAG2-1   ;Зловет заколдовал
 
        ld ix,(curmagic)
 
        call jpix
 
 
 
        LD A,(curarrowtype) ;Если уже какой-то спрайт  сделан
 
        AND A ;???по идее надо проверять на 255!!! TODO
 
        JR NZ,F6
 
 
 
;      LD A,PG_VIEW
 
        CALL PAGE_PG_VIEW
 
 
 
        PUSH HL
 
        CALL NP
 
        CALL Z,MASK
 
        POP HL
 
 
 
F6      LD D,L
 
        LD E,H
 
        LD HL,(DispMapX) ;H-Y, L-X
 
        ADD HL,DE
 
OLDC    LD DE,0
 
        LD (OLDC+1),HL
 
        EX DE,HL
 
        AND A
 
        SBC HL,DE
 
        RET Z      ;мы уже сюда тыкали
 
        LD HL,(HEROCRD)  ;H-Y, L-X
 
 
 
;если герой перемещается, то останавливаем его
 
        LD A,(RunHero+1)
 
        AND A
 
        JR Z,NEWpath
 
        LD BC,OLDpath
 
        LD (PATHadr+1),BC
 
 
 
NEWpath LD A,PG_MAP
 
;A=1
 
        LD (CLR_MAPp1),A ;для восстановления карты
 
        CALL PAGE
 
;HL=(HEROCRD) ;H=Y,L=X
 
;de=куда ;D=Y,E=X
 
        CALL SRCH_PATH
 
        LD A,(HL)
 
        INC A
 
        RET Z ;нет пути
 
        LD (RunHero+1),A
 
        LD (PATHadr+1),HL
 
F7
 
        LD A,201
 
        LD (FTASK),A
 
        RET 
 
 
 
VESHUP  AND A
 
        SBC HL,DE
 
        SBC HL,BC
 
        RET C
 
VSH_    ADD HL,BC
 
        LD (MSTRT+2),HL
 
        LD HL,INV+1
 
        INC (HL)
 
 
 
        LD HL,SND_LST
 
        LD (SAMPLE+1),HL
 
NP
 
        LD A,(KARM)
 
        AND A
 
        RET NZ
 
NP2     LD A,1       ;визуальное нажатие курсором
 
        LD (CCURS+1),A
 
        RET 
 
 
 
VESHDW  ADD HL,DE
 
        AND A
 
        SBC HL,BC
 
        LD A,L
 
        CP QVESH-4
 
        RET NC
 
        JR VSH_
 
 
 
;Упак. тексты диалогов
 
       if MEGALZ
 
        include "unmegalz.asm" ;DEC40
 
       
 
GL      INCBIN "gleb.mlz"
 
ZL      INCBIN "zlovet.mlz"
 
HV      INCBIN "hevor.mlz"
 
BK_     INCBIN "bukvin.mlz"
 
JO      INCBIN "jora.mlz"
 
PT      INCBIN "petro.mlz"
 
AL      INCBIN "alena.mlz"
 
FK      INCBIN "fekla.mlz"
 
ZD_     INCBIN "zadolb.mlz"
 
RP      INCBIN "replic.mlz"
 
       else ;HRUST2
 
GL      INCBIN "GLEB.p"
 
ZL      INCBIN "ZLOVET.p"
 
HV      INCBIN "HEVOR.p"
 
BK_     INCBIN "BUKVIN.p"
 
JO      INCBIN "JORA.p"
 
PT      INCBIN "PETRO.p"
 
AL      INCBIN "ALENA.p"
 
FK      INCBIN "FEKLA.p"
 
ZD_     INCBIN "ZADOLB.p"
 
RP      INCBIN "REPLIC.p"
 
       endif
 
 
 
SPRMENU
 
       INCBIN "GAMEMEN4.C" ;спрайт меню
 
 
 
ENDPROG ;EQU SPRMENU+1248
 
 
 
        page PG_MAP
 
MAP     EQU #C000
 
       if 1==1
 
        org 0xc000
 
       if EGA
 
        incbin "map.dat"
 
       else
 
        incbin "map6912.dat"
 
       endif
 
        incbin "mapflags.dat"
 
       endif
 
MASSIVE EQU MAP+8192
 
        ORG MASSIVE+4096;,PG_MAP
 
DNPK
 
       INCBIN "Day_nght.p" ;467 Упакован. спрайт дня и ночи
 
        ;page PG_MAP
 
        ;ORG DNPK+467;,PG_MAP
 
        INCLUDE "SCRIPTS.asm" ;Скрипты
 
 
 
SRCH_PATH
 
        INCLUDE "PATH-48H.asm" ;поиск пути 531 байт
 
stack   DS 4*(DX_MAP+DY_MAP)   ;+ 512 б буфер
 
                               ;итого 1043 байта
 
 
 
        ;DISPLAY /H,/T,MMENU
 
        ;DISPLAY /H,/T,mouse+1
 
        ;DISPLAY /H,/T,ROLL
 
        ;DISPLAY /H,/T,SCANTYP+1
 
        ;DISPLAY /H,/T,MSPEED+1
 
        ;DISPLAY /H,/T,MUSONp1
 
        ;DISPLAY /H,/T,SOUND
 
 
 
LN_MISC EQU $-#C000
 
MISCFRE EQU #FFFF-$
 
LN_MAP  EQU stack-DNPK
 
 
 
        DISPLAY "PG_MISC FREE=",MISCFRE
 
        DISPLAY "PG_MAP FREE = ",#FFFF-stack-512
 
        ;DISPLAY "Старт = ",IM2
 
        ;DISPLAY "Дл. = ",ENDPROG-IM2
 
;       DISPLAY "Дл. текстов = ",NOTUSE-GL
 
;       DISPLAY "Дл. Скриптов = ",SND-RUN_Q
 
        DISPLAY "Свободно = ",#C000-ENDPROG
 
        ;DISPLAY "Переменные = ",IM2-VARS
 
 
 
MAPMAS  EQU #C000
 
KSCR    EQU MAPMAS+4053
 
BKEY    EQU KSCR+3673
 
ABOUTS  EQU BKEY+4267  ;Об игре,авторах
 
FINPACK EQU ABOUTS+1781
 
;LODSAV  EQU FINPACK+1787
 
        page PG_MISC
 
        ORG #C000;,PG_MISC
 
TEXT    ;куда распак. текст
 
       INCBIN "MapMass.p"  ;4053 ;упакованная карта (распаковывается в PG_MAP), потом запарывается текстом текущего диалога
 
       INCBIN "KeyScr4.plc"  ;3673
 
       INCBIN "BELLKEY4.plc" ;4267
 
       INCBIN "ABOUTY.p"   ;1781
 
       INCBIN "BVssVMft.p" ;1787 ;анимация финала
 
        ;DISP #5800
 
        ;INCLUDE "saveload.asm" ;Загрузка/запись состояния игры
 
        ;ENT 
 
;LENLS   EQU $-LODSAV
 
FINAL   INCLUDE "FINAL.asm" ;Финал игры
 
 
 
        page PG_SPR
 
        ORG #C000;,PG_SPR
 
       if EGA
 
       include "cursors.ast" ;276 (0x114) байт на курсор
 
       ;include "hud.ast"
 
SPR=0xc000 ;чисто для вычислений по тайлам (потом при выводе пересчитываются)
 
       else
 
SPR
 
       INCBIN "SPRITEMh.C" ;16384
 
       endif
 
 
 
        page PG_HERO
 
        ORG #C000;,PG_HERO
 
       if !EGA
 
hero
 
VIDS    EQU hero+6144
 
       INCBIN "HeroSprX.C" ;6144
 
       else
 
hero=0;0x8000/4
 
VIDS
 
       endif
 
       INCBIN "VIDEO.p" ;упак. видео=10202, распак.=12132
 
       
 
        page PG_MUZ
 
        ORG #C000+5782;,PG_MUZ
 
PLAY
 
MUTE    EQU PLAY+5
 
VOLUME  EQU PLAY+10
 
MUSM    EQU PLAY+2139
 
MUS0    EQU MUSM+912
 
MUS1    EQU MUS0+722
 
MUS2    EQU MUS1+413
 
MUS3    EQU MUS2+1074
 
MUSF    EQU MUS3+1161
 
VARSPK  EQU MUSF+3099
 
MUSIC   EQU #C000+3222
 
 
 
        page PG_MUZ
 
        ;ORG MUSIC
 
        ;incbin "Menu.m--"
 
        ORG PLAY-824;,PG_MUZ
 
INTRO
 
       INCBIN "B1_otrez.m--";Мелодия для интро
 
       INCBIN "PLAYERX.C" ;Плеер музыки
 
       INCBIN "Menu.p"
 
       INCBIN "vera_00.p"
 
       INCBIN "vera_01.p"
 
       INCBIN "vera_02.p"
 
       INCBIN "vera_03.p"
 
       INCBIN "russia80.p"
 
       ;INCBIN "VARS_PAK.p" ;1020
 
 
 
LN_MUZ  EQU VARSPK+1020-INTRO
 
LN_HERO EQU 6144+10202
 
 
 
        page PG_VIEW
 
        ORG #C000+6912;,PG_VIEW
 
FNT
 
SPR33   EQU FNT+2048
 
wasARROWS  EQU SPR33+3456
 
VIEW    EQU wasARROWS+szARROWS
 
NG_MASK EQU VIEW+1039
 
WIN_SPR EQU NG_MASK+384 ;буфер 192 б
 
NG      EQU WIN_SPR+496 ;сюда распак. спрайт дня и ночи
 
;REZULT  EQU #5802 ;буфер 192 б
 
       INCBIN "4AXORFIX.F" ;2048 фонт Pulsar'а
 
      if EGA
 
       ds 3456
 
      else
 
       INCBIN "spr3x3.C"  ;3456 ;TODO убить в EGA
 
      endif
 
       ds 1440 ;INCBIN "spr2x2x.C" ;1440 ;стрелки нужны для меню
 
      if EGA
 
       ds 1039+384+496
 
      else 
 
       INCBIN "IFACE.plc"   ;1039 ;TODO убить в EGA
 
       INCBIN "Ngh_arr3.C" ;384 Спрайт маски и стрелки по OR ;TODO убить в EGA
 
       INCBIN "WIN_SPR.C" ;496 Спрайт окна диалога ;TODO убить в EGA
 
      endif
 
 
 
LN_VIEW EQU NG-FNT
 
 
 
        page PGHUD
 
        org 0xc000
 
        include "hud.ast"
 
szhud=$-0xc000
 
 
 
        page PGDAYNIGHT
 
        org 0xc000
 
        include "daynight.ast"
 
;hudmenu
 
        include "hudmenu.ast"
 
szdaynight=$-0xc000
 
 
 
;Для сохранения содержимого всех страниц
 
;раскомментировать и запустить:RUN SOBJ
 
;       ORG SPRMENU
 
;SOBJ   INCLUDE "SAVEOBJ"
 
 
 
        ;ORG MMENU ;start here
 
 
 
        ;savebin "VERAVARS.C",VARS,endvars-VARS
 
 
 
       if RUS
 
        savebin "vera.com",begin,ENDPROG-begin
 
        savebin "vera/vars.bin",VARS,0x600
 
       else
 
        savebin "veraeng.com",begin,ENDPROG-begin
 
        savebin "vera/varseng.bin",VARS,0x600
 
       endif
 
 
 
        page PG_SPR
 
        savebin "vera/0_page.bin",SPR,16384
 
        page PG_MAP
 
       if RUS
 
        savebin "vera/1_page.bin",0xc000,LN_MAP+0x3000;,DNPK,LN_MAP
 
       else
 
        savebin "vera/1_pageng.bin",0xc000,LN_MAP+0x3000;,DNPK,LN_MAP
 
       endif
 
        ;savebin "vera/1_page.bin",DNPK,LN_MAP
 
        page PG_MISC
 
       if RUS
 
        savebin "vera/3_page.bin",0xc000,LN_MISC
 
       else
 
        savebin "vera/3_pageng.bin",0xc000,LN_MISC
 
       endif
 
        page PG_HERO
 
        savebin "vera/4_page.bin",0xc000,LN_HERO
 
        page PG_MUZ
 
        savebin "vera/6_page.bin",0xc000,0x4000;INTRO,LN_MUZ
 
        page PG_VIEW
 
        savebin "vera/7_page.bin",FNT,LN_VIEW
 
        page PGHUD
 
        savebin "vera/hud.bin",0xc000,szhud
 
        page PGDAYNIGHT
 
        savebin "vera/daynight.bin",0xc000,szdaynight
 
 
 
        LABELSLIST "../../../us/user.l"
 
 
 
       display "HEROCRD=",HEROCRD