Login

Subversion Repositories NedoOS

Rev

Rev 1000 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

        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