?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM1024
  2.         include "../../_sdk/sys_h.asm"  
  3.  
  4.         include "settings.ast"
  5.  
  6.         SLOT 0
  7.         page 8
  8.         SLOT 3
  9.  
  10. EGA=1
  11. FREESCROLL=1;TODO 0
  12. PRFULLMAP=0
  13.  
  14. MEGALZ=1 ;тексты диалогов не в Hrust2
  15.  
  16. STACK=0x4000;0x61a8
  17. GAMESTACK=0x3f80;0xFFFF
  18.  
  19. INT_IM2=0
  20. SETIM2_TWICE=0
  21. INT_USE_BC=1-EGA
  22.  
  23. scrbase=0x4000+4
  24. iconsscraddr=scrbase+25+(32*40)
  25. faceiconsscraddr=scrbase+(17*8*40)+1
  26. sprmaxwid=48;32
  27. sprmaxhgt=32
  28. scrwid=128+8;160 ;double pixels
  29. scrhgt=192;200
  30. INTSTACK=0x3f00
  31. tempsp=0x3f06 ;6 bytes for prspr
  32.  
  33. FIXMOUSE=0 ;так в VERAENGN, а 1 в исходнике
  34.  
  35. FILAT   EQU 8*6+64  ;атриб. окна
  36. FILAT2  EQU 8*6+1+64 ;атриб. кнопки
  37.  
  38. PGTILES0=0x20
  39. PGTILES1=0x21
  40. PGTILES2=0x22
  41. PGTILES3=0x23
  42. PGICONS=0x24
  43. PGSPRITES0=0x25
  44. PGSPRITES1=0x26
  45. PGSPRTRAN0=0x27
  46. PGSPRTRAN1=0x28
  47. PGHUD=0x29
  48. PGDAYNIGHT=0x2a
  49.  
  50. szARROWS=45*32
  51.  
  52. ;25.08.08
  53. ;Переменные для игры
  54. ;IM2     EQU #6666 ;расположение вторых прерываний
  55. SHADSCR EQU #4000 ;Теневой экран (линейный)
  56. SCR     EQU #C000 ;Основной экран
  57. SCRWD   EQU 24    ;ширина видимого экрана в знакоместах
  58. SCRHG   EQU 24    ;высота видимого экрана в -/-
  59. FRAME   EQU 2     ;кол-во фреймов между обновлениями экрана
  60. MAX_X   EQU 245   ;Предел для курсора по X
  61. MAX_Y   EQU 181   ;Предел для курсора по Y
  62. QVESH   EQU 18 ;кол-во вещей в мешке
  63. SPD_HERO EQU 1 ;V перемещения героя (меньше число - больше V)
  64. ROTSPD  EQU 2 ;скорость поворота героя при взятии предметов
  65. STEPS   EQU 2 ;кол-во пикселей на кот. перемещ. герой за 1 шаг
  66. STEP1   EQU (16/STEPS)-1
  67. STEP2   EQU (8/STEPS)-1
  68. DSTV    EQU 1 ;На сколько близко должна наход. вещь от героя
  69. DSTP    EQU 2 ;На сколько близко должен наход. персонаж от героя
  70. FR      EQU 16 ;частота мигания курсора
  71. SCMOD   EQU 20 ;задержка перед входом в режим скролла карты
  72. FRM     EQU 25 ;частота (фреймов) мигания кнопок в диалоге
  73. FRM2    EQU 6 ;кол-во фреймов на кот. показывается курсор пути
  74. PERS    EQU 10 ;кол-во персонажей в игре с кот. можно разговар.
  75. TOKEN   EQU 7 ;кол-во управляющих кодов (токенов) в тексте-1
  76. MAXTASK EQU 5 ;макс. кол-во задач
  77. SPD_NGT EQU 1200 ;кол-во фреймов, через кот. скролл. спрайт дня
  78.                  ;эта единица является игровым часом
  79. VIDSPD  EQU 3 ;скор. видео (MAX 2)
  80. COUNT   EQU 26 ;кол-во миганий героя
  81.  
  82. ;Страницы
  83. PG_SPR  EQU 0 ;6912:спрайты 2*2 512 штук, EGA:cursors
  84. PG_MAP  EQU 1 ;карта,массив,путь,скрипты,звуки
  85. PG_EXCH=2 ;для обмена с 0x9000 (VIDEOS)
  86. PG_MISC EQU 3 ;распак. текст,ключевой кадр, упак.карта,массив
  87. PG_HERO EQU 4 ;спрайты героя
  88. PG_MUZ  EQU 6 ;Плеер,музыка
  89. PG_VIEW EQU 7 ;упак. экран
  90.  
  91.         ;slot 3
  92.         ;page 0
  93.         org PROGSTART
  94. begin
  95.         jp begin2 ;/prsprqwid (sprites in file are made so that they return here)
  96. begin2
  97.         ld sp,STACK
  98.         OS_HIDEFROMPARENT
  99.  
  100.         ld e,3+0x80 ;6912+keep
  101.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  102.  
  103.         ;ld e,1
  104.         ;OS_SETSCREEN
  105.         ld e,0 ;color byte
  106.         OS_CLS
  107.         ;ld e,0
  108.         ;OS_SETSCREEN
  109.         ;ld e,0 ;color byte
  110.         ;OS_CLS
  111.  
  112.         OS_GETMAINPAGES
  113. ;dehl=pages in 0000,4000,8000,c000
  114.         ld a,e
  115.         ld (pggfx),a
  116.         ld a,h
  117.         ld (pgcode8000),a
  118.         ld a,l
  119.         ld (pgcodec000),a
  120.         ;OS_NEWPAGE
  121.         ;ld a,e
  122.         ld (tpgs+0),a
  123.  
  124.         OS_NEWPAGE
  125.         ld a,e
  126.         ld (tpgs+PG_EXCH),a
  127.  
  128.         OS_NEWPAGE
  129.         ld a,e
  130.         ld (pgfake),a ;эту страницу можно будет запарывать при отрисовке спрайтов с клипированием
  131.         ld (pgfake2),a
  132.         ;OS_NEWPAGE
  133.         ;ld a,e
  134.         ;ld (pgmain4000),a
  135.        
  136.         ld de,res_path
  137.         OS_CHDIR
  138.         ;ld de,muzfilename
  139.         ;call openstream_file
  140.         ;ld a,7
  141.         ;call setpg
  142.         ;ld de,music
  143.         ;ld hl,music_sz
  144.         ;call readstream_file
  145.         ;call closestream_file
  146.        
  147.         ld hl,levelfilenames
  148. loadlevels0
  149.         ld a,(hl) ;pg
  150.         inc hl
  151.         cp -1
  152.         jr z,loadlevels0q
  153.        or a
  154.        jr z,loadlevels0_nonewpg
  155.        push hl
  156.        ld h,tpgs/256
  157.        ld l,a
  158.        push hl
  159.        OS_NEWPAGE
  160.        pop hl
  161.        ld (hl),e
  162.        ld a,l
  163.        pop hl
  164. loadlevels0_nonewpg
  165.         call setpg
  166.         ld e,(hl)
  167.         inc hl
  168.         ld d,(hl)
  169.         inc hl
  170.         push hl
  171.         push de ;addr
  172.         ex de,hl
  173.         call openstream_file
  174.         pop de
  175.         ld hl,0x4000
  176.         call readstream_file
  177.         call closestream_file
  178.         pop hl
  179.         xor a
  180.         ld b,a
  181.         ld c,a
  182.         cpir ;hl=after #0
  183.         jr loadlevels0
  184. loadlevels0q
  185.  
  186.         if !EGA
  187.         ld a,(user_scr1_high) ;ok
  188.         SETPG16K
  189.         ld a,PG_VIEW
  190.         call PAGE
  191.         ld hl,0xc000
  192.         ld de,0x4000
  193.         ld bc,0x4000
  194.         ldir
  195.         ld a,(user_scr0_high) ;ok
  196.         SETPG16K
  197.         call setpggfxc000
  198.         ld hl,0xc000
  199.         ld de,0x4000
  200.         ld bc,0x4000
  201.         ldir
  202.         call setpgcodec000
  203.         endif
  204.  
  205.         ;call PAGE_PG_VIEW
  206.         ;ld hl,wasARROWS
  207.         ;ld de,ARROWS
  208.         ;ld bc,szARROWS
  209.         ;ldir ;TODO recode for EGA
  210.  
  211.         ld a,PGDAYNIGHT
  212.         call setpg
  213.         ld hl,0xc000
  214.         ld de,0xc000+(152*32/2)
  215.         ld bc,48*32/2
  216.         ldir
  217.         ld hl,0xc000+(200*32/2)
  218.         ld de,0xc000+(200*32/2)+(152*32/2)
  219.         ld bc,48*32/2
  220.         ldir
  221.  
  222.         call changescrpg_current
  223.        ;ld (curscrnum_int),a
  224.  
  225.         xor a
  226.         call setpg
  227.  
  228.         ld hl,prsprqwid
  229.         ld (0x0101),hl ;спрайты в файле подготовлены так, что выходят в 0x0100
  230.  
  231.         jp MMENU
  232.  
  233.        if RUS
  234. varsfn
  235.         db "vars.bin",0
  236. savefn
  237.         db "vera.ini",0
  238.        else
  239. varsfn
  240.         db "varseng.bin",0
  241. savefn
  242.         db "veraeng.ini",0
  243.        endif
  244.        
  245.         align 256
  246. tpgs
  247.         ds 64;256
  248.  
  249.         include "palev.ast" ;verapalevening
  250.         include "palnight.ast" ;verapalnight
  251.         include "paldawn.ast" ;verapaldawn
  252.         include "palday.ast" ;verapalday
  253. standardpal
  254.         STANDARDPAL
  255. pal
  256.         ds 32,0xff
  257. emptypal
  258.         ds 32,0xff
  259.  
  260. egaon
  261.         db 0 ;/1
  262.  
  263. quiter
  264.         if 1==0
  265.         halt
  266. pgmuznum=$+1
  267.         ld a,0
  268.         SETPG32KHIGH
  269.           ld hl,muz
  270.           OS_SETMUSIC
  271.         halt
  272.         endif
  273.         call swapimer
  274.         im 1
  275.         call killmuz ;because we played music not by OS
  276.         QUIT
  277.  
  278. killmuz
  279.         ld a,0xfe
  280.         call shut1ay
  281.         ld a,0xff
  282. shut1ay
  283.         ld bc,0xfffd
  284.         out (c),a
  285.         ld de,0x0e00
  286. shutay0
  287.         dec d
  288.         ld b,0xff
  289.         out (c),d
  290.         ld b,0xbf
  291.         out (c),e
  292.         jr nz,shutay0
  293.         ret
  294.  
  295. redattr_killable2b
  296.         dw 0
  297.  
  298.        if EGA
  299. prtileega
  300. ;Печать тайла 2*2 знакоместа в теневом экране
  301. ;DE=адрес в теневом экране (D=2*Y+SHADSCR, E=2*X)
  302. ;HL=адрес тайла (0xc000,0xc020...)
  303. ;для EGA адрес надо умножить на 4
  304.         add hl,hl
  305.         add hl,hl
  306.         ld a,h
  307.         rlca
  308.         rlca
  309.         and 3
  310.         add a,PGTILES0
  311.         call setpg
  312.         ld a,h
  313.         or 0xc0
  314.         ld h,a
  315.         ex de,hl
  316.         res 6,h ;2*Y
  317.         ld a,l ;2*X
  318.         ld l,h
  319.         ld h,0
  320.         ld b,h
  321.         ld c,l ;hl=bc=2*Y
  322.         add hl,hl
  323.         add hl,hl
  324.         add hl,bc ;10*Y
  325.         add hl,hl
  326.         add hl,hl ;40*Y
  327.         add hl,hl
  328.         add hl,hl
  329.         add hl,hl
  330.         add hl,hl ;16*40*Y
  331.        add a,scrbase&0xff
  332.         ld c,a ;2*X
  333.         ld b,0x40
  334.         add hl,bc
  335.        call setpgsscr40008000_current ;shadow
  336.         ld bc,0x1008
  337. ;b=hgt,c=wid (/2)
  338. ;de=gfx
  339. ;hl=scr
  340.         ld a,55 ;"scf"
  341.         ld (wasdrawimg),a
  342.         jp primgega_onescreen_setpgsmain40008000
  343.         ;jp primgega
  344.  
  345. ;Печать блока 3*3 знакоместа на основном экране (FIXME - сейчас на обоих! вызывается в IM2)
  346. ;HL-адрес спрайта
  347. ;DE-адрес в экране (а не координаты в обычных знакоместах D-X, E-Y)
  348. BLOCK33
  349.         ld a,PGICONS
  350.         call setpg
  351.         ex de,hl
  352.         ;ld hl,0x4000+24 ;TODO
  353.         ld bc,0x180c
  354. ;b=hgt,c=wid (/2)
  355. ;de=gfx
  356. ;hl=scr
  357. primgega
  358.         push bc
  359.         call setpgsscr40008000;_current ;visible
  360.         pop bc
  361.         push bc
  362.         push de
  363.         push hl
  364.         call primgega_onescreen
  365.         call setpgsscr40008000_current ;shadow
  366.         pop hl
  367.         pop de
  368.         pop bc
  369.         jp primgega_onescreen_setpgsmain40008000
  370.        endif
  371.  
  372.        if 1;!EGA
  373. setpggfxc000
  374. pggfx=$+1
  375.         ld a,0
  376.         SETPG32KHIGH
  377.         ret
  378.        endif
  379. setpgcodec000
  380. pgcodec000=$+1
  381.         ld a,0
  382.         SETPG32KHIGH
  383.         ret
  384.  
  385. setcurscr1
  386.         call setcurscr0
  387.         jr setcurscr_change
  388.  
  389. ;Черный экран, текущим делаем 0-й
  390. BLACK
  391.         ld a,(user_scr0_high) ;ok
  392.         SETPG4000
  393.        
  394.         LD HL,#4000
  395.         LD DE,#4001
  396.         LD BC,6911
  397.         LD (HL),L
  398.         LDIR
  399. ;        LD A,16
  400. ;CURSCR  LD (PG_+1),A
  401. setcurscr0
  402.         ld a,(curscrnum)
  403.         or a
  404.         jr z,PAGE_PG_VIEW ;nz???
  405. setcurscr_change
  406.         call changescrpg_current
  407.        ld (curscrnum_int),a
  408.         ;ld e,a
  409.         ;OS_SETSCREEN
  410.  
  411. PAGE_PG_VIEW
  412.        if EGA
  413.         LD A,PG_VIEW
  414.        else
  415.         push bc
  416.         ld a,(user_scr1_high) ;ok
  417.         SETPGC000
  418.         pop bc
  419.         ret
  420.        endif
  421.  
  422. ;Драйвер переключения страниц для 128-го
  423. ;A-номер нужной страницы
  424. PAGE
  425. setpg
  426.         push bc
  427.         ;and 0xe7
  428.          ;cp 2
  429.          ;jr z,$
  430.          ;cp 5
  431.          ;jr z,$
  432.         ;ld ($+4),a
  433.         ;ld a,(tpgs) ;так нереентерабельно нельзя, т.к. используется и в обработчике прерываний!
  434.         ld c,a
  435.         ld b,tpgs/256
  436.         ld a,(bc)
  437.         SETPGC000
  438.         pop bc
  439.         ret
  440.  
  441. ;        PUSH BC
  442. ;        LD (NUMPAGE),A
  443. ;PG_     OR 16+8
  444. ;        LD BC,#7FFD
  445. ;        OUT (C),A
  446. ;        POP BC
  447. ;        RET
  448. ;NUMPAGE DB 0
  449.  
  450. setpgscr7
  451.         push bc
  452.         ld a,(user_scr1_high) ;ok
  453.         SETPGC000
  454.         pop bc
  455.         ret
  456.  
  457.        if EGA
  458. swapre
  459. arroffega_scraddr2=$+1
  460.         ld de,0
  461.         ld hl,(arroffega_scraddr)
  462.         ld (arroffega_scraddr),de
  463.         ld (arroffega_scraddr2),hl
  464. arroffega_bufaddr2=$+1
  465.         LD de,mouse_buf2
  466.         ld hl,(arroffega_bufaddr)
  467.         ld (arroffega_bufaddr),de
  468.         ld (arroffega_bufaddr2),hl
  469.         ret
  470.        endif
  471.  
  472. FMCNT2  DB SCMOD ;счетчик
  473.  
  474. ;Буфер под курсором мышки
  475. ;(он один для основного экрана и теневого)
  476. mouse_buf
  477.        if EGA
  478.         ds 16*16/2
  479. mouse_buf2
  480.         ds 16*16/2
  481.        else
  482.         DS 48
  483.        endif
  484. ;Спрайт курсора
  485. ARROW   DS 64
  486. ;Адреса печатаемых тайлов в теневом экране
  487. A_TILE  DS 40*2 ;max 144*2
  488.         DB 0
  489.  
  490. reter
  491.         ret
  492.  
  493. setpgmain4000
  494.         ld a,(user_scr0_high) ;ok
  495.         SETPG4000
  496.         ret
  497.  
  498. setpgsmain40008000
  499. ;pgmain4000=$+1
  500.         ;ld a,0
  501.         ld a,(user_scr0_high) ;ok
  502.         SETPG4000
  503. pgcode8000=$+1
  504.         ld a,0
  505.         SETPG8000
  506.         ret
  507.  
  508. setpgscr4000;_current
  509.         call getuser_scr_high_cur
  510.         SETPG4000
  511.         ret
  512.  
  513. setpgscr4000_scr2
  514.         call getuser_scr_high
  515.         SETPG4000
  516.         ret
  517.  
  518. setpgsscr40008000;_current
  519.         call getuser_scr_low_cur
  520.         SETPG4000
  521.         call getuser_scr_high_cur
  522.         SETPG8000
  523.         ret
  524.  
  525. setpgsscr40008000_current
  526.         call getuser_scr_low
  527.         SETPG4000
  528.         call getuser_scr_high
  529.         SETPG8000
  530.         ret
  531.  
  532. setpgc000_shadowscr
  533.         call getuser_scr_high
  534.         SETPGC000
  535.         ret
  536.  
  537. setpgc000_curscr
  538.         call getuser_scr_high_cur
  539.         SETPGC000
  540.         ret
  541.  
  542. getuser_scr_low
  543. getuser_scr_low_patch=$+1
  544. getuser_scr_low_patchN=0xff&(user_scr0_low^user_scr1_low)
  545.         ld a,(user_scr1_low) ;ok
  546.         ret
  547.  
  548. getuser_scr_high
  549. getuser_scr_high_patch=$+1
  550. getuser_scr_high_patchN=0xff&(user_scr0_high^user_scr1_high)
  551.         ld a,(user_scr1_high) ;ok
  552.         ret
  553.  
  554. getuser_scr_low_cur
  555. getuser_scr_low_cur_patch=$+1
  556. getuser_scr_low_cur_patchN=0xff&(user_scr0_low^user_scr1_low)
  557.         ld a,(user_scr0_low) ;ok
  558.         ret
  559.  
  560. getuser_scr_high_cur
  561. getuser_scr_high_cur_patch=$+1
  562. getuser_scr_high_cur_patchN=0xff&(user_scr0_high^user_scr1_high)
  563.         ld a,(user_scr0_high) ;ok
  564.         ret
  565.  
  566. changescrpg_current
  567.         ld hl,getuser_scr_low_patch
  568.         ld a,(hl)
  569.         xor getuser_scr_low_patchN
  570.         ld (hl),a
  571.         ld hl,getuser_scr_high_patch
  572.         ld a,(hl)
  573.         xor getuser_scr_high_patchN
  574.         ld (hl),a
  575.         ld hl,getuser_scr_low_cur_patch
  576.         ld a,(hl)
  577.         xor getuser_scr_low_cur_patchN
  578.         ld (hl),a
  579.         ld hl,getuser_scr_high_cur_patch
  580.         ld a,(hl)
  581.         xor getuser_scr_high_cur_patchN
  582.         ld (hl),a
  583.  
  584.         ld a,1
  585. curscrnum=$+1
  586.         xor 0
  587.         ld ($-1),a
  588.         ret
  589.        
  590.         if 1==0
  591. changescrpg
  592.         call changescrpg_current
  593.         ld (curscrnum_int),a
  594.         ret
  595.         endif
  596.  
  597. primgega_pgdaynight
  598.        ld a,PGDAYNIGHT
  599.         jr primgega_pga
  600. primgega_pghud
  601.        ld a,PGHUD
  602. primgega_pga
  603. ;a=pg
  604. ;b=hgt,c=wid (/2)
  605. ;de=gfx
  606. ;hl=scr
  607.         push bc
  608.         push de
  609.         push hl
  610.        push af
  611.        ld a,55
  612.        ld (im_arroff),a
  613.        call ARROFF
  614.        pop af
  615.        ld (primgega_pg),a
  616.        ;ld a,PGHUD
  617.        call setpg
  618.         call setpgsscr40008000;_current ;visible
  619.         pop hl
  620.         pop de
  621.         pop bc
  622.         push bc
  623.         push de
  624.         push hl
  625.         call primgega_onescreen
  626.        call ARRON
  627.        ld a,55+128 ;"or a"
  628.        ld (im_arroff),a
  629. primgega_pg=$+1
  630.        ld a,PGHUD
  631.        call setpg
  632.         call setpgsscr40008000_current ;shadow
  633.         pop hl
  634.         pop de
  635.         pop bc
  636.         ld a,55 ;"scf"
  637.         ld (wasdrawimg),a
  638. primgega_onescreen_setpgsmain40008000
  639.         call primgega_onescreen
  640.         jp setpgsmain40008000
  641. primgega_onescreen
  642. ;b=hgt,c=wid (/2)
  643. ;de=gfx
  644. ;hl=scr
  645. ;call from DAY_NGT
  646. primgega0
  647.         push bc
  648.         ld hx,b
  649.         push hl
  650.         ld bc,40
  651. primgegacolumn0
  652.         ld a,(de)
  653.         inc de
  654.         ld (hl),a
  655.         add hl,bc
  656.         dec hx
  657.         jr nz,primgegacolumn0
  658.         pop hl
  659.         ld a,0x9f;0xa0
  660.         cp h
  661.         ld bc,0x4000
  662.         adc hl,bc
  663.         jp pe,primgegacolumn0q ;в половине случаев
  664. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  665.          inc a
  666.         xor h
  667.         ld h,a
  668. primgegacolumn0q
  669.         pop bc
  670.         dec c
  671.         jr nz,primgega0
  672.         ret
  673.  
  674. getimgega_onescreen
  675. ;b=hgt,c=wid (/2)
  676. ;de=gfx
  677. ;hl=scr
  678. ;call from DAY_NGT
  679. getimgega0
  680.         push bc
  681.         ld hx,b
  682.         push hl
  683.         ld bc,40
  684. getimgegacolumn0
  685.         ld a,(hl)
  686.         ld (de),a
  687.         inc de
  688.         add hl,bc
  689.         dec hx
  690.         jr nz,getimgegacolumn0
  691.         pop hl
  692.         ld a,0x9f;0xa0
  693.         cp h
  694.         ld bc,0x4000
  695.         adc hl,bc
  696.         jp pe,getimgegacolumn0q ;в половине случаев
  697. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  698.          inc a
  699.         xor h
  700.         ld h,a
  701. getimgegacolumn0q
  702.         pop bc
  703.         dec c
  704.         jr nz,getimgega0
  705.         ret
  706.  
  707. climgega
  708. ;in IM2
  709.         ;ld a,55 ;"scf"
  710.         ;ld (wasdrawimg),a
  711.         push bc
  712.         push de
  713.         push hl
  714.        ;ld a,55
  715.        ;ld (im_arroff),a
  716.        ;call ARROFF
  717.         call setpgsscr40008000;_current ;visible
  718.         pop hl
  719.         pop de
  720.         pop bc
  721.         push bc
  722.         push de
  723.         push hl
  724.         call climgega_onescreen
  725.        ;call ARRON
  726.        ;ld a,55+128 ;"or a"
  727.        ;ld (im_arroff),a
  728.         call setpgsscr40008000_current ;shadow
  729.         pop hl
  730.         pop de
  731.         pop bc
  732.         ;ld a,55 ;"scf"
  733.         ;ld (wasdrawimg),a
  734. climgega_onescreen
  735. ;b=hgt,c=wid (/2)
  736. ;e=gfx byte
  737. ;hl=scr
  738. climgega0
  739.         push bc
  740.         ld hx,b
  741.         push hl
  742.        ld a,e
  743.         ld bc,40
  744. climgegacolumn0
  745.         ld (hl),a
  746.         add hl,bc
  747.         dec hx
  748.         jr nz,climgegacolumn0
  749.         pop hl
  750.         ld a,0x9f;0xa0
  751.         cp h
  752.         ld bc,0x4000
  753.         adc hl,bc
  754.         jp pe,climgegacolumn0q ;в половине случаев
  755. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  756.          inc a
  757.         xor h
  758.         ld h,a
  759. climgegacolumn0q
  760.         pop bc
  761.         dec c
  762.         jr nz,climgega0
  763.         ;call setpgcodec000
  764.         jp setpgsmain40008000
  765.  
  766. clsega
  767.         call changescrpg_current
  768.         call clsega_onescreen
  769.         call changescrpg_current
  770. clsega_onescreen
  771.         call setpgsscr40008000
  772.         ld hl,0x4000
  773.         ld de,0x4001
  774.         ld bc,0x7fff
  775.         ld (hl),l;0
  776.         ldir
  777.         jp setpgsmain40008000
  778.  
  779. ;Работа меню при IM2
  780. IM2MEN
  781.         LD HL,IM2MC
  782.         INC (HL)
  783.         LD A,(HL)
  784.         CP VIDSPD
  785.         JR NZ,IM2M1
  786.         LD E,0
  787.  
  788. ;подкл. невидим. стр.
  789.         ;LD A,(PG_+1)
  790.         ;BIT 3,A
  791.         ;LD A,7
  792.         ;JR Z,$+4
  793.         ;LD A,5
  794.         ;PUSH AF
  795.         ;CALL PAGE
  796.        call setpgc000_shadowscr
  797.  
  798.         LD HL,(VIDEO_SP)
  799.         LD (MMENU2_1),HL
  800.         CALL VIDEO_2
  801.  
  802.         LD HL,mouse_buf
  803.         LD DE,A_TILE
  804.         LD BC,48
  805.         LDIR
  806.         LD HL,(ARRTO+1)
  807.         LD (MMN2+1),HL
  808.  
  809. ;невид. делаем видимой
  810.         ;POP AF
  811.         ;CALL PAGE
  812.        call setpgc000_shadowscr ;???
  813.         ;LD A,(PG_+1)
  814.         ;XOR 8
  815.         ;LD (PG_+1),A
  816.        call changescrpg_current
  817.        ld (curscrnum_int),a
  818.        ld e,a
  819.        OS_SETSCREEN
  820.         JR IM2M2
  821.  
  822. IM2M1
  823. ;подкл. видим. стр.
  824.         ;LD A,(PG_+1)
  825.         ;BIT 3,A
  826.         ;LD A,5
  827.         ;JR Z,$+4
  828.         ;LD A,7
  829.         ;CALL PAGE
  830.        call setpgc000_curscr
  831.  
  832.         CALL ARROFF
  833. IM2M2   CALL ARRON
  834.         JP MUS
  835.  
  836. MMENU2
  837. MMENU2_1=$+1
  838.         LD HL,VIDEOS
  839.         LD A,0 ;счетчик фреймов
  840. IM2MC   EQU $-1
  841.         CP VIDSPD+1
  842.         RET NZ
  843.         XOR A
  844.         LD (IM2MC),A
  845.  
  846.         LD (VIDEO_SP),HL
  847.         ;LD A,(PG_+1)
  848.         ;BIT 3,A   ;подкл. невидим. стр.
  849.         ;LD A,7
  850.         ;JR Z,$+4
  851.         ;LD A,5
  852.         ;CALL PAGE
  853.        call setpgc000_shadowscr
  854.  
  855.         LD IX,A_TILE
  856. MMN2    LD HL,0
  857.         CALL ARRTO+3
  858.  
  859. ;Вывод 1 кадра видео
  860. VIDEO
  861.         LD E,1
  862. VIDEO_2
  863.         LD (VIDSP+1),SP
  864. VIDEO_SP=$+1
  865. VID1m2=$+1
  866.         LD SP,VIDEOS
  867.        jp VID1go
  868. VID1
  869.         LD (HL),C ;иначе может запороть 0x01xx
  870. VID1go
  871.         POP HL
  872.  
  873. ;Если процедуру вызывать не внутри
  874. ;прерывания, то POP HL нужно заменить на
  875. ;POP BC:LD H,B:LD L,C
  876.  
  877.         POP BC      ;1 знакоместо
  878.         LD (HL),C
  879.         INC H
  880.         LD (HL),B
  881.         INC H
  882.  
  883.         POP BC
  884.         LD (HL),C
  885.         INC H
  886.         LD (HL),B
  887.         INC H
  888.  
  889.         POP BC
  890.         LD (HL),C
  891.         INC H
  892.         LD (HL),B
  893.         INC H
  894.  
  895.         POP BC
  896.         LD (HL),C
  897.         INC H
  898.         LD (HL),B
  899.  
  900.         POP BC      ;атрибут
  901.         LD H,B
  902.         ;LD (HL),C
  903.         DJNZ VID1
  904.         LD (VIDEO_SP),SP
  905.  
  906. VIDSP   LD SP,0
  907.  
  908. VID2_1=$+1
  909.         LD A,0      ;счетч. кадров
  910.         ADD A,E
  911.         CP 5        ;кол-во кадров
  912.         JR C,VID4
  913. VID3    XOR A
  914.         LD HL,VIDEOS
  915.         LD (VIDEO_SP),HL
  916. VID4    LD (VID2_1),A
  917.         RET
  918.  
  919. ;клавиши "1,2,3,4,5"
  920. DIGKp1
  921.         db 0
  922.  
  923. KEYSp1
  924.         db 0
  925.  
  926. ;клавиши мыши+колесо
  927. MKEYSp1
  928.         db 0
  929.  
  930.         include "int.asm"
  931.         include "prspr.asm"
  932.         include "saveload.asm" ;Загрузка/запись состояния игры
  933.         include "IM2.asm"
  934.         INCLUDE "PRINT.asm" ;печать спрайтов, текста и т.п.
  935.         INCLUDE "TALK.asm"  ;Обслуживание диалогов
  936.         include "talktext.asm"
  937.  
  938. ;Начало сохраняемых переменных
  939. VARS    INCLUDE "VARS.asm" ;реально они будут сюда распаковываться
  940. ENDVARS
  941. LEN_S   EQU (256*6)-(ENDVARS-VARS)
  942.         display "VARS=",VARS
  943.         display "LEN_S=",LEN_S
  944. daynightphase
  945.         db 0
  946.        if EGA
  947. gamemenucolorline;=#DAD9
  948.         ds 6
  949.        else
  950. gamemenucolorline=#DAD9
  951.        endif
  952.  
  953.        if EGA
  954. NEV1
  955.         xor d
  956. NEV2
  957.         xor h
  958. NEV3
  959.         xor l ;если в этих ячейках 0 - рисовать только силуэт
  960.        endif
  961.         DS LEN_S;-3 ;добираем до 6-ти секторов
  962. endvars
  963.        
  964. ABOT
  965.         ;DISP #4000
  966.         include "about.asm"
  967. ;        ENT
  968. ;LENPR   EQU $-ABOT
  969.         ;DISPLAY "ABOUT=",ABOT,LENPR
  970.  
  971.        display "=",$
  972. res_path
  973.         db "vera",0
  974.  
  975. levelfilenames
  976.         db 0
  977.         dw SPR;0xc000
  978.         db "0_page.bin",0
  979.         db 1
  980.         ;dw DNPK
  981.         dw 0xc000;DNPK
  982. mapfn
  983.        if RUS
  984.         db "1_page.bin",0
  985.        else
  986.         db "1_pageng.bin",0
  987.        endif
  988.         db 3
  989.         dw 0xc000
  990.        if RUS
  991.         db "3_page.bin",0
  992.        else
  993.         db "3_pageng.bin",0
  994.        endif
  995.         db 4
  996.         dw 0xc000
  997.         db "4_page.bin",0
  998.         db 6
  999.         dw 0xc000
  1000.         db "6_page.bin",0
  1001.         db 7
  1002.         dw 0xdb00
  1003.         db "7_page.bin",0
  1004.         db PGTILES0;8
  1005.         dw 0xc000
  1006.         db "tiles0.bin",0
  1007.         db PGTILES1;9
  1008.         dw 0xc000
  1009.         db "tiles1.bin",0
  1010.         db PGTILES2;10
  1011.         dw 0xc000
  1012.         db "tiles2.bin",0
  1013.         db PGTILES3;11
  1014.         dw 0xc000
  1015.         db "tiles3.bin",0
  1016.         db PGICONS;12
  1017.         dw 0xc000
  1018.         db "icons.bin",0
  1019.         db PGSPRITES0;13
  1020.         dw 0xc000
  1021.         db "sprites0.bin",0
  1022.         db PGSPRITES1;14
  1023.         dw 0xc000
  1024.         db "sprites1.bin",0
  1025.         db PGSPRTRAN0;15
  1026.         dw 0xc000
  1027.         db "sprtran0.bin",0
  1028.         db PGSPRTRAN1;16
  1029.         dw 0xc000
  1030.         db "sprtran1.bin",0
  1031.         db PGHUD;17
  1032.         dw 0xc000
  1033.         db "hud.bin",0
  1034. hudmsg=0xc000+6144
  1035.         db PGDAYNIGHT;18
  1036.         dw 0xc000
  1037.         db "daynight.bin",0
  1038.         db -1
  1039.  
  1040.         include "../../_sdk/file.asm"
  1041.  
  1042. ARROWS
  1043.         INCBIN "spr2x2x.C" ;1440 ;стрелки нужны для меню
  1044. ;        ds szARROWS
  1045. REZULT  ds 192 ;EQU #5802 ;буфер 192 б для маски дня и ночи
  1046. ;в оригинале экран #4000 - линейный буфер
  1047.  
  1048.         display "-----",$
  1049. ;=============================================================
  1050. ;=================== 0x6000+
  1051.  
  1052.         ds 0x8000-$;IM2-1536-$;ORG IM2-1536
  1053.         ;INCLUDE "IM2.asm"
  1054. ;IMVEC   EQU ($/256+1)*256;вектор вторых прерываний
  1055. ;START   EQU IMVEC+257 ;старт основной программы
  1056.  
  1057. ;Основная программа
  1058. GAME
  1059.  
  1060.         LD HL,MUS
  1061.         LD (IM2Nm2),HL ;иначе хочет рисовать видео
  1062.         LD HL,1
  1063.         LD (SPN+1),HL
  1064.        if SETIM2_TWICE
  1065.         CALL SETIM2
  1066.        endif
  1067.  
  1068.        if !EGA
  1069.         CALL BLACK
  1070.        endif
  1071.         CALL EXCH ;было обменяно 9000<->c000 на время меню
  1072.  
  1073.         ;LD HL,MUSNUM
  1074.         ;DEC (HL) ;???
  1075.  
  1076. NEW_OLDp1=$+1
  1077.         LD A,0
  1078.         AND A
  1079.         PUSH AF
  1080.         JR NZ,OLD
  1081.  
  1082.         LD A,PG_MUZ
  1083.         CALL PAGE
  1084.         ;LD HL,VARSPK
  1085.         ;LD DE,VARS
  1086.         ;CALL DEHRUST ;теперь грузим в GAMEOVER_MMENU
  1087.  
  1088.         LD DE,#4000
  1089.         PUSH DE,DE
  1090.        if 1==0
  1091.         LD A,PG_MISC
  1092.         CALL PAGE
  1093.         ld hl,#c000
  1094.         PUSH DE
  1095.         LD BC,KSCR-MAPMAS
  1096.         LDIR
  1097.         POP HL
  1098.         LD DE,#C000
  1099.         LD A,PG_MAP
  1100.         CALL PAGE
  1101.         CALL DEHRUST
  1102.        else
  1103.         LD A,PG_MAP
  1104.         CALL PAGE
  1105.        endif      
  1106.  
  1107.         POP DE
  1108.         LD HL,DNPK
  1109.         CALL DEHRUST
  1110.  
  1111.         ;LD A,PG_VIEW
  1112.         CALL PAGE_PG_VIEW
  1113.         POP HL
  1114.         LD DE,NG
  1115.         LD BC,608
  1116.         LDIR
  1117.  
  1118. OLD     LD A,PG_MAP
  1119.         CALL PAGE
  1120.  
  1121.         CALL INIGAME
  1122.         LD (FLASH+1),A  ;A<>0
  1123.  
  1124.        if EGA
  1125.         ld a,255 ;нет стрелки
  1126.         ld (curarrowtype),a
  1127.         ld de,emptypal
  1128.         OS_SETPAL
  1129.         ld e,0+0x80 ;EGA+keep
  1130.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  1131.         ld a,1
  1132.         ld (egaon),a
  1133.         call clsega ;обработчик прерывания уже порывается рисовать стрелочку!
  1134.         ;ld de,verapalevening
  1135.         ;ld de,verapalnight
  1136.         ;ld de,verapaldawn
  1137.         ld de,verapalday
  1138.         OS_SETPAL
  1139.        endif
  1140.  
  1141.         ;LD A,PG_VIEW
  1142.         CALL PAGE_PG_VIEW
  1143.        if !EGA
  1144.         LD HL,VIEW
  1145.         CALL LC5   ;распак. игр. экран
  1146.        endif
  1147.  
  1148.         LD A,(KARM)
  1149.         CALL MSK
  1150.  
  1151.        if EGA
  1152.        ;draw HUD
  1153.         ;ld a,PGHUD
  1154.         ;call setpg
  1155.         ld bc,0xc020
  1156.         ld de,0xc000
  1157.         ld hl,scrbase+24
  1158. ;b=hgt,c=wid (/2)
  1159. ;de=gfx
  1160. ;hl=scr
  1161.         call primgega_pghud
  1162.         ;jr $
  1163.        ;else
  1164.        endif
  1165.         CALL FONE
  1166.         CALL PRMAP ;Печать видимой части карты на теневом экр.
  1167.         CALL MOVE  ;Обновл. основн. экрана
  1168.  
  1169.         LD A,R
  1170.         LD (RND+1),A
  1171.  
  1172.         CALL MUSNXT
  1173.  
  1174.         LD HL,IM2N
  1175.         LD (IM2Nm2),HL
  1176.  
  1177.        if !EGA
  1178.         ;LD A,16+8
  1179.         ;CALL CURSCR
  1180.         call setcurscr1
  1181.        endif
  1182.  
  1183.         POP AF ;NEW_OLDp1
  1184.         LD A,1
  1185.         CALL Z,TALK
  1186.  
  1187. ;Основной цикл
  1188. MAPING
  1189.        if EGA
  1190.         ld a,55
  1191.         ld (im_swapscr),a
  1192.        endif
  1193. MAPINGwait
  1194.         HALT
  1195. MAPINGp2=$+1
  1196.         LD A,0 ;timer
  1197. MAPINGp4=$+1
  1198.         CP FRAME
  1199.         JR C,MAPINGwait
  1200.         XOR A
  1201.         LD (MAPINGp2),A
  1202.  
  1203. MAPS    CALL MOVE  ;Обновл. основн. экрана
  1204.         CALL PRMAP ;Печать видимой части карты на теневом экр.
  1205.  
  1206. SPDHERO LD A,SPD_HERO
  1207.         DEC A
  1208.         LD (SPDHERO+1),A
  1209.         JR NZ,CrdHero
  1210. SPH     LD A,SPD_HERO
  1211.         LD (SPDHERO+1),A
  1212. RunHero LD A,0     ;Перемещается ли герой?
  1213.         AND A
  1214.         CALL NZ,RUNING
  1215. CrdHero LD DE,0    ;Текущие координаты героя в пикселях
  1216.         ;D-Y, E-X
  1217. SprHero LD HL,hero ;Текущий спрайт героя
  1218.  
  1219.         LD A,PG_HERO
  1220.         CALL PAGE
  1221. CLR_MAPm2=$+1
  1222.         CALL HERO ;/HERO2  ;Печать героя на теневом экране
  1223. CLR_MAPp1=$+1
  1224.         LD A,0
  1225.         DEC A
  1226.         CALL Z,CLMAP ;восстанавливаем карту после заливки (поиска маршрута)
  1227. MAINLOOP
  1228.         LD HL,(mouse_crd)
  1229.         CALL CALC
  1230. ;KEYS
  1231.         LD A,(KEYSp1)
  1232.         BIT 5,A
  1233.         JP NZ,STEAL ;скрытый режим (SS+CS)
  1234.         BIT 7,A
  1235.         CALL NZ,TLKNG ;листание диалога (Enter)
  1236.  
  1237.         CALL MOVMAP
  1238.  
  1239.         LD A,(DIGKp1) ;клавиши "1,2,3,4,5"
  1240.         CP 31
  1241.         JR NZ,CHG
  1242.         XOR A
  1243.         LD (CHANGE),A
  1244. CHG     CALL NZ,CHANGE
  1245.  
  1246.         LD A,PG_MAP
  1247.         CALL PAGE
  1248.         LD A,#FE  ;"C"
  1249.         IN A,(#FE)
  1250.         BIT 3,A
  1251.         CALL Z,CENTR ;герой по центру
  1252.  
  1253. ;клавиши мыши+колесо
  1254. MKEYS
  1255.         LD A,(MKEYSp1)
  1256. MKEYSp2
  1257.         LD H,28
  1258.         RLA
  1259.         PUSH AF
  1260.         CALL C,VLIST ;DWN
  1261.         DEC H
  1262.         POP AF
  1263.         RLA
  1264.         PUSH AF
  1265.         CALL C,VLIST ;UP
  1266.         POP AF
  1267.         RLA
  1268.         PUSH AF
  1269.         CALL C,VUSE1 ;правая клавиша
  1270.         POP AF
  1271.         RLA
  1272.         CALL C,FIRE  ;левая клавиша
  1273.  
  1274. MKY     ;LD A,PG_VIEW
  1275.         CALL PAGE_PG_VIEW
  1276.  
  1277. ;идет ли диалог?
  1278.         CALL SCRLMAP
  1279. DIALOG  LD A,0
  1280.         DEC A
  1281.         JP Z,CURS1
  1282.  
  1283. ;Работа с мешком
  1284.         LD HL,(mouse_crd) ;H-X,L-Y
  1285.         CALL BOX ;Выделение кнопки меню
  1286.         CALL VMESH
  1287.         JP NZ,CCURS
  1288.  
  1289. ;Скролл игр.экрана при подведении
  1290. ;курсора к границам экрана
  1291.         LD BC,#0000
  1292.         LD D,B
  1293.         LD E,B
  1294. ;влево
  1295. ;       LD BC,#00FF
  1296. ;       LD DE,#0010
  1297.  
  1298.         LD A,H      ;X
  1299.         AND A
  1300.         JR NZ,SR
  1301.         DEC C  ;-1
  1302.         LD E,16
  1303.  
  1304. ;вправо
  1305. ;       LD BC,#0001
  1306. ;       LD DE,#00F0
  1307.  
  1308. SR      CP MAX_X    ;240
  1309.         JR C,SD
  1310.         LD C,1
  1311.         LD E,-16
  1312.  
  1313. ;вниз
  1314. ;       LD BC,#0100
  1315. ;       LD DE,#F000
  1316.  
  1317. SD      LD A,L      ;Y
  1318.         CP MAX_Y
  1319.         JR C,SU
  1320.         INC B     ;1
  1321.         LD D,-16
  1322.  
  1323. ;вверх
  1324. ;       LD BC,#FF00
  1325. ;       LD DE,#1000
  1326.  
  1327. SU      AND A
  1328.         JR NZ,SRUN
  1329.         LD B,-1
  1330.         LD D,16
  1331.  
  1332. SRUN    LD A,B
  1333.         OR C
  1334.         JP Z,CCURS ;экран не двигаем
  1335.         LD A,2           ;курсор скролла карты
  1336.  
  1337. ;В зависимости от того в какую сторону
  1338. ;тянем курсор, изменяем смещение карты и коорд. героя
  1339.  
  1340. ;Проверка на границы карты при скролле
  1341. ;проверка срабатывает и на 0
  1342. ;т.к. при уменьшении 0 получаем 255
  1343.  
  1344. SCROLL
  1345.         EXA
  1346.         LD HL,(DispMapX) ;H-Y, L-X
  1347.         LD A,H
  1348.         ADD A,B
  1349.         CP 64-(SCRHG/2-1)
  1350.         JR C,SL1 ;не вышли за пределы карты
  1351.         LD B,0
  1352.         LD D,B
  1353.         LD A,H
  1354. SL1     LD H,A
  1355.         LD A,L
  1356.         ADD A,C
  1357.         CP 64-(SCRWD/2-1)
  1358.         JR C,SL2
  1359.         LD C,0
  1360.         LD E,C
  1361.         LD A,L
  1362. SL2     LD L,A
  1363.         PUSH HL
  1364.  
  1365.         LD HL,(CrdHero+1)
  1366.         LD A,H
  1367.         ADD A,D
  1368.         LD H,A
  1369.         LD A,L
  1370.         ADD A,E
  1371.         LD L,A
  1372.         POP DE
  1373.         EX DE,HL
  1374.  
  1375. ;Флаг - может ли герой уходить из поля видимости
  1376. ;1-может,0-нет
  1377. MODscrl LD A,0
  1378.        if FREESCROLL
  1379.        ld a,1
  1380.        endif
  1381.         AND A
  1382.         JR NZ,NOBOUND
  1383.  
  1384. ;Проверка на выход героя из поля видимости
  1385. ;при скролле карты
  1386.  
  1387.         LD A,(HEROCRD+1) ;Y героя
  1388.         DEC A
  1389.         SUB H
  1390.         JR C,NOSCRL1
  1391.         CP SCRHG/2-1
  1392.         JR C,K4
  1393.         BIT 7,B
  1394.         JR Z,K4
  1395.         LD B,0
  1396. NOSCRL1 BIT 7,B
  1397.         JR NZ,K4
  1398.         LD B,0
  1399.  
  1400. K4      LD A,(HEROCRD)   ;X героя
  1401.         SUB L
  1402.         JR C,NOSCRL2
  1403.         CP SCRWD/2
  1404.         JR C,K3
  1405.         BIT 7,C
  1406.         JR Z,K3
  1407.         LD C,0
  1408. NOSCRL2 BIT 7,C
  1409.         JR NZ,K3
  1410.         LD C,0
  1411.  
  1412. K3      LD A,C
  1413.         OR B
  1414.         JR Z,CURSR ;не двигаем экран
  1415.  
  1416.         LD A,B
  1417.         AND A
  1418.         JR NZ,K5
  1419.         LD A,(DispMapX+1) ;Y
  1420.         LD H,A
  1421.         LD A,(CrdHero+2)
  1422.         LD D,A
  1423.  
  1424. K5      LD A,C
  1425.         AND A
  1426.         JR NZ,NOBOUND
  1427.         LD A,(DispMapX)   ;X
  1428.         LD L,A
  1429.         LD A,(CrdHero+1)
  1430.         LD E,A
  1431.  
  1432. NOBOUND
  1433.         LD (DispMapX),HL ;H-Y, L-X
  1434.         LD (CrdHero+1),DE
  1435.        if EGA
  1436.        ld a,3 ;3,2 - печатаем, 1 - не печатаем (кроме как под героем)
  1437.        else
  1438.         XOR A
  1439.        endif
  1440.         LD (MAPFLAG+1),A ;обновить весь экран
  1441.  
  1442.         EXA
  1443.         CP 2
  1444.         JR Z,CURS1p1
  1445. CURSR   CALL SCRLMAP
  1446.         JR C,CURS1
  1447. CCURS   LD A,0      ;Текущий курсор
  1448.         LD B,A
  1449.         LD A,(F3+1) ;В мешке ли курсор?
  1450.         AND A
  1451.         LD A,(KARM)
  1452.         JR Z,CURS0  ;Нет
  1453.         LD B,6      ;курсор руки
  1454. CURS0   AND A
  1455.         JR NZ,CURS1p1
  1456.         LD A,(UNDER+1)
  1457.         AND A
  1458.         LD A,6      ;рука (берем предмет)
  1459.         JR NZ,CURS1p1
  1460. CURS01  LD A,(DISTP)
  1461.         AND A
  1462.         JR Z,CURS1
  1463.         LD B,5      ;курсор диалога
  1464. CURS1   LD A,B
  1465. CURS1p1
  1466.         CALL MASK   ;Делаем новый спрайт курсора, если нужно
  1467.  
  1468.         CALL FTASK
  1469.  
  1470. ;Конец игры
  1471. END_G_1=$+1
  1472.         LD A,1
  1473.         DEC A
  1474.         JP NZ,ENDGAME
  1475.        ;jp ENDGAME
  1476.         CALL DAY_NGT
  1477.         CALL VOLCH ;плавное -/+ громкости мелодии
  1478. REMAP   LD A,0    ;для принудительного обновления экрана
  1479.         DEC A
  1480.         JP NZ,MAPING
  1481.         LD (REMAP+1),A
  1482.        if EGA
  1483.        ld a,3 ;3,2 - печатаем, 1 - не печатаем (кроме как под героем)
  1484.        endif
  1485.         LD (MAPFLAG+1),A
  1486.         JP MAPING
  1487.  
  1488. ;Главное меню игры (мельница)
  1489. GAMEOVER_MMENU
  1490.         ld hl,gamemenucolorline
  1491.         ld (hl),0 ;кнопка меню не активна
  1492.  
  1493.         call SETIM1 ;чтобы не включать 2 раза SETIM2
  1494.        if EGA
  1495.         ld de,emptypal
  1496.         OS_SETPAL
  1497.        
  1498.         ld de,varsfn
  1499.         OS_OPENHANDLE
  1500.         push bc
  1501.         ld de,VARS
  1502.         LD hl,0x600
  1503.         OS_READHANDLE
  1504.         pop bc ;b=handle
  1505.         OS_CLOSEHANDLE
  1506.  
  1507.         ld a,PG_MAP
  1508.         call setpg
  1509.         ld de,mapfn
  1510.         OS_OPENHANDLE
  1511.         push bc
  1512.         ld de,0xc000
  1513.         LD hl,0x4000
  1514.         OS_READHANDLE
  1515.         pop bc ;b=handle
  1516.         OS_CLOSEHANDLE      
  1517.  
  1518.         xor a
  1519.         ld (curscrnum_int),a
  1520.         ld e,a
  1521.         OS_SETSCREEN
  1522.  
  1523.         ld e,3+0x80 ;6912+keep
  1524.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  1525.         call BLACK
  1526.         ld de,standardpal
  1527.         OS_SETPAL
  1528.         xor a
  1529.         ld (egaon),a
  1530.        endif
  1531. MMENU
  1532.         DI
  1533. ;       LD (backsp+1),SP
  1534.         LD SP,GAMESTACK;#5FFF
  1535.         LD HL,MUS
  1536.         LD (IM2Nm2),HL
  1537.         CALL INIMOUS ;инициализация мышки
  1538.         CALL BLACK
  1539.         LD A,255
  1540.         CALL MUSNXT+3
  1541.         CALL SETIM2 ;по второму разу не делать!!!
  1542.         CALL EXCH ;обмен 9000<->c000
  1543.  
  1544.         LD A,PG_HERO
  1545.         CALL PAGE
  1546.         LD HL,VIDS
  1547.         LD DE,VIDEOS
  1548.         CALL DEHRUST ;в 9000
  1549. SKPMN
  1550.         CALL VID3 ;инициализация видео?
  1551.         LD (MMENU2_1),HL
  1552.         LD (IM2MC),A ;время кадра видео
  1553.         DEC A
  1554.         LD (MCM+1),A
  1555.  
  1556.         call setpgscr4000
  1557.  
  1558.         LD A,PG_MISC
  1559.         CALL PAGE
  1560.         LD HL,KSCR
  1561.         LD DE,#4000
  1562.         PUSH DE,DE
  1563.         LD BC,3673
  1564.         LDIR
  1565.  
  1566.       ;LD A,PG_VIEW
  1567.         CALL PAGE_PG_VIEW
  1568.         ;call setpgscr7
  1569.         ;call setpgc000_shadowscr
  1570.  
  1571.         POP HL
  1572.         CALL LC5
  1573.        
  1574.        if EGA
  1575.         ;ld a,(tpgs+PG_VIEW)
  1576.         ;SETPG4000
  1577.         call setpgscr4000_scr2
  1578.         ld hl,0xc000
  1579.         ld de,0x4000
  1580.         ld bc,6912
  1581.         ldir
  1582.  
  1583.         call setpgscr4000
  1584.        endif
  1585.  
  1586.         HALT
  1587.         DI
  1588.         LD B,5
  1589. MMLP    PUSH BC
  1590.         CALL VIDEO
  1591.         POP BC
  1592.         DJNZ MMLP
  1593.         EI
  1594.  
  1595.         LD HL,#C000
  1596.         POP DE
  1597.         LD BC,6912
  1598.         LDIR
  1599.  
  1600.         call setpgmain4000
  1601.  
  1602.         XOR A
  1603.         CALL MSK
  1604.         CALL ARRON
  1605.  
  1606.         ;LD A,16+8
  1607. MMENUS  ;CALL CURSCR
  1608.         call setcurscr1
  1609.  
  1610.         LD HL,IM2MEN
  1611.         LD (IM2Nm2),HL
  1612.  
  1613.         LD IX,MNKEYS2
  1614.         LD DE,#0905
  1615.         LD HL,#5878
  1616.         LD BC,#0B15
  1617.         LD A,E
  1618.  
  1619.         CALL MCYCL ;цикл работы меню, выход по enter
  1620.  
  1621.         LD HL,NEW_OLDp1
  1622.         DEC C
  1623.         LD (HL),C
  1624.         JP Z,GAME ;новая игра
  1625.         DEC C
  1626.         JR Z,OGM  ;старая игра
  1627.         DEC C
  1628.         JR Z,ABOUT;об игре
  1629.         DEC C,C
  1630.         JP Z,EXIT
  1631.  
  1632. ABOUT
  1633.         PUSH BC
  1634.  
  1635.         LD HL,MUS
  1636.         LD (IM2Nm2),HL
  1637.  
  1638.         ;LD A,16+8
  1639.         ;CALL CURSCR
  1640.         call setcurscr1
  1641.         ;LD A,PG_MISC
  1642.         ;CALL PAGE
  1643.         ;LD HL,ABOUTS
  1644.         ;LD DE,#4000
  1645.         ;CALL DEHRUST
  1646.         POP BC
  1647.         LD D,1
  1648.         CALL PRINTER;#4000
  1649.         CALL BLACK
  1650.         JP SKPMN
  1651.  
  1652. OGM     ;CALL SETIM1
  1653.         JP LOAD ;-> GAME
  1654.  
  1655. ;На строку ниже в экранном файле
  1656. LINE_HL INC     H
  1657.         LD      A,H
  1658.         AND     7
  1659.         RET     NZ
  1660.         LD      A,L
  1661.         ADD     A,32
  1662.         LD      L,A
  1663.         RET     C
  1664.         LD      A,H
  1665.         SUB     8
  1666.         LD      H,A
  1667.         RET
  1668.  
  1669. DIV32   SRL H,L
  1670. DIV16   SRL H,L
  1671. DIV8    SRL H
  1672.         SRL H
  1673.         SRL H
  1674.         SRL L
  1675.         SRL L
  1676.         SRL L
  1677.         RET
  1678.  
  1679. ;Установка вектрора IM2
  1680.        if INT_IM2
  1681. SETIM2
  1682.         DI
  1683.         LD HL,IMVEC ;адрес вектора прерываний
  1684.         LD BC,256
  1685.         LD D,H
  1686.         LD E,B
  1687.         LD (HL),IM2/256
  1688.         LD A,H
  1689.         LDIR
  1690.         LD I,A
  1691.         IM 2
  1692.         EI
  1693.         RET
  1694.        else
  1695. SETIM2=swapimer
  1696.        endif
  1697.  
  1698. SETIM1
  1699.         DI
  1700.         ;LD A,(PG_+1)
  1701.         ;LD (SCRNUM+1),A ;???
  1702.         LD A,PG_MUZ
  1703.         CALL PAGE
  1704.         CALL MUTE
  1705.         ;LD A,16+8
  1706.         ;CALL CURSCR
  1707.         call setcurscr1
  1708.         LD A,PG_MISC
  1709.         CALL PAGE
  1710.        if INT_IM2
  1711.         LD IY,23610
  1712.         LD A,63
  1713.         LD I,A
  1714.         IM 1
  1715.        else
  1716.         call swapimer
  1717.        endif
  1718.         EI
  1719.         ;LD HL,LODSAV
  1720.         ;LD DE,LOAD
  1721.         ;LD BC,LENLS
  1722.         ;LDIR
  1723.         RET
  1724.  
  1725. ;Игровое меню
  1726. GMEN
  1727.        if EGA
  1728.         LD A,(gamemenucolorline);(#DAD9) ;где-то в атрибутах
  1729.         CP 56+64
  1730.         RET NZ
  1731.  
  1732.         xor a
  1733.         ld (curarrowtype),a
  1734.  
  1735.         LD HL,SND_SPK
  1736.         LD (SAMPLE+1),HL
  1737.  
  1738.         POP HL ;для коррекции SP
  1739.         POP HL
  1740.  
  1741.         ld bc,0x0834
  1742.         ld de,hudmenuofft
  1743.         ld hl,scrbase+(5*8*40)+6
  1744. ;b=hgt,c=wid (/2)
  1745. ;de=gfx
  1746. ;hl=scr
  1747.         call primgega_pgdaynight
  1748.  
  1749.         ld de,hudmenuoff0
  1750.         ld hl,scrbase+(6*8*40)+6
  1751.         ld bc,0x1834
  1752.         call primgega_pgdaynight
  1753.         ld de,hudmenu0
  1754.         ld hl,scrbase+(6*8*40)+7
  1755.         ld bc,0x182c
  1756.         call primgega_pgdaynight
  1757.         ld de,hudmenuoff1
  1758.         ld hl,scrbase+(9*8*40)+6
  1759.         ld bc,0x1834
  1760.         call primgega_pgdaynight
  1761.         ld de,hudmenuoff2
  1762.         ld hl,scrbase+(12*8*40)+6
  1763.         ld bc,0x1834
  1764.         call primgega_pgdaynight
  1765.  
  1766.         ld bc,0x1034
  1767.         ld de,hudmenuoffb
  1768.         ld hl,scrbase+(15*8*40)+6
  1769.         call primgega_pgdaynight
  1770.        
  1771.        else
  1772. ;      LD A,PG_VIEW
  1773.         CALL PAGE_PG_VIEW
  1774.         LD A,(gamemenucolorline);(#DAD9) ;где-то в атрибутах
  1775.         CP 56+64
  1776.         RET NZ
  1777.  
  1778.         LD HL,SND_SPK
  1779.         LD (SAMPLE+1),HL
  1780.  
  1781.         POP HL ;для коррекции SP
  1782.         POP HL
  1783.  
  1784.         XOR A
  1785.         CALL MASK
  1786.  
  1787. ;Вывод меню
  1788.         LD HL,SPRMENU
  1789.         LD DE,#C0A6
  1790.         LD A,12*8 ;высота
  1791. MN2     EX AF,AF' ;'
  1792.         PUSH DE
  1793.         LD C,13   ;ширина
  1794.         LDI
  1795.         JP PE,$-2
  1796.         POP DE
  1797.         EX DE,HL
  1798.         CALL LINE_HL
  1799.         EX DE,HL
  1800.         EX AF,AF' ;'
  1801.         DEC A
  1802.         JR NZ,MN2
  1803.  
  1804. ;Раскрашивание
  1805.  
  1806.         LD HL,#D8A6
  1807.         LD E,12
  1808.         LD A,FILAT
  1809.         LD C,19
  1810. FIL     LD B,13
  1811.         LD (HL),A
  1812.         INC L
  1813.         DJNZ $-2
  1814.         ADD HL,BC
  1815.         DEC E
  1816.         JR NZ,FIL
  1817.  
  1818.         LD A,#68
  1819.         LD H,A
  1820.         LD L,A
  1821.         LD (#D8A6),HL
  1822.         LD (#D8B1),HL
  1823.         LD (#DA0B),HL
  1824.         LD (#DA0D),A
  1825.         LD (#DA06),A
  1826.         LD (#DA12),A
  1827.        endif
  1828.  
  1829.         XOR A
  1830.         LD (MCM+1),A
  1831.  
  1832.         LD IX,MNKEYS ;структура выделения пунктов
  1833.         LD DE,#0B04
  1834.         LD HL,FILAT2+(FILAT*256)
  1835.         LD BC,#0B15
  1836.         LD A,3
  1837.         CALL MCYCL
  1838.         DEC C
  1839.         JR Z,GAM
  1840.         DEC C
  1841.         JP NZ,GAMEOVER_MMENU
  1842. SAV     ;CALL SETIM1
  1843.         JP SAVE
  1844.  
  1845.        if 1==0
  1846. ERROR
  1847.         CALL ERR
  1848.       ;LD A,PG_VIEW
  1849.         CALL PAGE_PG_VIEW
  1850.         LD HL,#D800
  1851.         LD DE,#5800
  1852.         LD BC,768
  1853.         LDIR
  1854.         CALL SETIM2
  1855. ;SCRNUM  LD A,0
  1856.         JP MMENUS
  1857.  
  1858. ERROR2
  1859.         CALL ERR
  1860.        endif
  1861.        
  1862. SAVE_OK ;CALL SETIM2
  1863. ;      LD A,PG_VIEW
  1864.         CALL PAGE_PG_VIEW
  1865.  
  1866. GAM     CALL FONE
  1867.         XOR A
  1868.         LD H,A
  1869.         LD L,A
  1870.         CALL BOX ;Выделение кнопки меню
  1871.         JP REMAP+6
  1872.  
  1873. ;Работа в меню
  1874. ;OUT: C-номер выбранного пункта меню (1-X)
  1875. MCYCL
  1876. ;a=количество пунктов
  1877. ;l=атрибут кнопки
  1878. ;h=атрибут окна
  1879. ;b=ширина пункта
  1880. ;c=приращение для перехода на следующую строку
  1881.         LD (MENLP-1),A  ;кол-во пунктов
  1882.         LD (SCANMOD+1),A
  1883.         LD A,L
  1884.         LD (MN_V1+1),A  ;атриб. кнопки
  1885.         LD A,H
  1886.         LD (MN_V2+1),A  ;атриб. окна
  1887.         LD A,B
  1888.         LD (MN_V3+1),A  ;ширина пункта
  1889.         LD A,C
  1890.         LD (MN_V4+1),A  ;приращение
  1891.  
  1892.        if EGA
  1893.        xor a ;несуществующий пункт
  1894.        ld (oldmenuoption),a
  1895.        endif
  1896.         LD A,1
  1897.         LD (SETCURp1),A ;текущий пункт меню - верхний
  1898.  
  1899. ;Цикл опроса кнопок
  1900. MNLOOP  PUSH IX,IX,DE
  1901.         HALT
  1902. MCM     LD A,0
  1903.         AND A
  1904.         DI
  1905.         CALL NZ,MMENU2 ;show anim and arrow
  1906.         EI
  1907.         POP DE,IX
  1908.         CALL PUNKT
  1909.        if EGA
  1910.         ld hl,(egaon)
  1911.         dec l
  1912.         jr nz,MNLOOPnoega
  1913. oldmenuoption=$+1
  1914.        cp 0 ;бывший текущий пункт меню
  1915.        jr z,MNLOOPnodraw ;не перерисовывать, если текущий пункт не менялся
  1916.        ld (oldmenuoption),a
  1917. MNLOOPnoega
  1918.        endif
  1919.         EXA
  1920.         LD C,1
  1921.         LD A,3      ;кол-во пунктов в меню
  1922. MENLP   EXA
  1923.         SUB 3
  1924.         CALL MNLOCK
  1925.         INC C
  1926.         EXA
  1927.         DEC A
  1928.         JR NZ,MENLP
  1929. MNLOOPnodraw
  1930.         POP IX
  1931.         DEC C
  1932.         LD HL,MKEYSp1
  1933.  
  1934.         LD A,(HL)
  1935.         AND %00010000
  1936.         LD B,A
  1937.         LD A,(HL)
  1938.         AND %11000000 ;колесо мышки
  1939.  
  1940.         BIT 5,(HL)    ;правую клавишу мышки
  1941.         JR Z,$+3      ;делаем аналогом
  1942.         SCF           ;ENTER
  1943.  
  1944.         RRA
  1945.         OR B
  1946.         LD B,A
  1947.         LD A,(KEYSp1)
  1948.         AND %11100000
  1949.         OR B
  1950.  
  1951.         LD (HL),0
  1952.  
  1953.         ADD A,A     ;7-й бит (ENTER)
  1954.         JR C,FIR_K
  1955.         LD B,1
  1956.         ADD A,A     ;6-й  вниз
  1957.         JR C,CDWN
  1958.         ADD A,A     ;5-й  вверх
  1959.         JR C,CDWN-3
  1960.         ADD A,A     ;4-й  огонь
  1961.         JR C,FIR_M
  1962.         LD A,FRM
  1963.         JR CDU
  1964.         LD BC,#FF01
  1965. ;Вверх/вниз по меню
  1966. CDWN    LD A,FRM
  1967.         DEC A
  1968.         JR Z,CDWUP
  1969. CDU     CP FRM-1
  1970.         LD (CDWN+1),A
  1971.         JR NZ,MNLOOP
  1972. CDWUP   LD HL,SETCURp1
  1973.         LD A,(HL)
  1974.         CP C
  1975.         JR Z,MNLOOP
  1976.         ADD A,B
  1977.         LD (HL),A
  1978.         JR MNLOOP
  1979.  
  1980. ;OUT: B-текущий пункт
  1981. ;     CY-курсор не на пункте
  1982. ;    NC-на пункте
  1983. PUNKT
  1984.         LD HL,(mouse_crd)
  1985.         CALL DIV8
  1986.         LD A,H      ;X
  1987.         SUB 7
  1988.         CP D        ;D=ширина области
  1989.         JP NC,SETCUR
  1990. PN1     LD BC,0
  1991.         LD (PN1+1),HL
  1992.         XOR A
  1993.         SBC HL,BC
  1994.         JP Z,SETCUR
  1995.         ADD HL,BC
  1996.         LD A,L      ;Y
  1997.         SUB E
  1998.         JP DIV3
  1999.  
  2000. ;Нажали огонь в меню мышкой/курсором
  2001. FIR_M   ;XOR A
  2002.         ;LD (HL),A
  2003.         LD (PN1+1),HL ;специально принуждаем неравенство
  2004.        ;jr $
  2005.         CALL PUNKT ;OUT: B-текущий пункт
  2006.         JP C,MNLOOP ;если курсор не на пункте меню, то MNLOOP
  2007.         LD A,(SETCURp1)
  2008.         CP B
  2009.         JP NZ,MNLOOP
  2010.  
  2011. ;Кнопка выбрана (Enter)
  2012. FIR_K   LD HL,SND_NXT
  2013.         LD (SAMPLE+1),HL
  2014.         LD A,(SETCURp1)
  2015.         LD C,A
  2016.         XOR A
  2017.         LD (SCANMOD+1),A
  2018.         RET
  2019.  
  2020. ;Выделение пунктов
  2021. MNLOCK
  2022.         PUSH AF
  2023.         PUSH BC
  2024.         PUSH DE
  2025.         PUSH IX
  2026. MN_V2   LD B,FILAT ;атриб. невыделенного пункта
  2027.         JR NZ,MN_V1_ok
  2028.         LD A,C
  2029.         LD (SETCURp1),A ;текущий пункт меню - выделенный рисуемый
  2030.  
  2031. MN_V1   LD B,FILAT2 ;атриб. выделения
  2032. MN_V1_ok
  2033.        if EGA
  2034.         ld a,(egaon)
  2035.         rrca
  2036.         jr nc,MN_noega;MNEND
  2037.        
  2038.         ld a,b
  2039.         cp FILAT ;атриб. невыделенного пункта
  2040.         jr z,MN_unselect
  2041.        
  2042.         ld de,hudmenu2
  2043.         ld hl,scrbase+(12*8*40)+7
  2044.        dec c
  2045.        jr nz,$+5+3
  2046.         ld de,hudmenu0
  2047.         ld hl,scrbase+(6*8*40)+7
  2048.        dec c
  2049.        jr nz,$+5+3
  2050.         ld de,hudmenu1
  2051.         ld hl,scrbase+(9*8*40)+7
  2052.         ld bc,0x182c
  2053. ;b=hgt,c=wid (/2)
  2054. ;de=gfx
  2055. ;hl=scr
  2056.         call primgega_pgdaynight
  2057.         jr MNEND
  2058. MN_unselect
  2059.         ld de,hudmenuoff2
  2060.         ld hl,scrbase+(12*8*40)+6
  2061.        dec c
  2062.        jr nz,$+5+3
  2063.         ld de,hudmenuoff0
  2064.         ld hl,scrbase+(6*8*40)+6
  2065.        dec c
  2066.        jr nz,$+5+3
  2067.         ld de,hudmenuoff1
  2068.         ld hl,scrbase+(9*8*40)+6
  2069.         ld bc,0x1834
  2070. ;b=hgt,c=wid (/2)
  2071. ;de=gfx
  2072. ;hl=scr
  2073.         call primgega_pgdaynight
  2074.         jr MNEND
  2075. MN_noega
  2076.        endif
  2077.         LD E,(IX)
  2078.         LD D,(IX+1)
  2079.         LD A,(DE)  ;если кнопка уже выкрашена, то не красим
  2080.         CP B
  2081.         JR Z,MNEND
  2082.         LD A,B
  2083.         LD C,3    ;высота строки выделения
  2084. MNLP0   LD H,(IX+2)
  2085.         LD L,(IX+3)
  2086. MN_V3   LD B,11
  2087. MNLP1   ADD HL,HL
  2088.         JR NC,MNLP
  2089.         LD (DE),A
  2090. MNLP    INC DE
  2091.         DJNZ MNLP1
  2092. MN_V4   LD HL,21
  2093.         ADD HL,DE
  2094.         EX DE,HL
  2095.         INC IX,IX
  2096.         DEC C
  2097.         JR NZ,MNLP0
  2098. MNEND   POP IX
  2099.         LD BC,8
  2100.         ADD IX,BC
  2101.         POP DE
  2102.         POP BC
  2103.         POP AF
  2104.         RET
  2105.  
  2106. ;Выделение кнопки меню
  2107. BOX
  2108.         PUSH HL
  2109.         CALL DIV8
  2110.         LD BC,#0638
  2111.         LD A,L
  2112.         CP 22
  2113.         JR NZ,BX1
  2114.         LD A,H
  2115.         CP 25
  2116.         JR C,BX1
  2117.         LD C,56+64
  2118. BX1
  2119.         LD HL,gamemenucolorline;#DAD9
  2120.         LD A,(HL)
  2121.         CP C
  2122.         JR Z,BX2
  2123.         LD (HL),C
  2124.         INC L
  2125.         DJNZ $-2
  2126.        if EGA
  2127.         ;ld a,(egaon)
  2128.         ;or a
  2129.         ;ret nz ;TODO?
  2130.         ld a,c
  2131.         cp 56+64
  2132.         ld de,menuline0
  2133.         jr nz,$+5
  2134.         ld de,menuline1
  2135.         ld hl,scrbase+(176*40)+25
  2136.         ld bc,0x0818
  2137. ;b=hgt,c=wid (/2)
  2138. ;de=gfx
  2139. ;hl=scr
  2140.         call primgega_pghud
  2141.        
  2142.        endif
  2143. BX2     POP HL
  2144.         RET
  2145.  
  2146. MNKEYS  DW #D8C7
  2147.         DB %11100001,%10000000
  2148.         DB %11111111,%11100000
  2149.         DB %11000000,%01100000
  2150.  
  2151.         DW #D927
  2152.         DB %11000001,0
  2153.         DB %11111111,%11100000
  2154.         DB %00110000,%11100000
  2155.  
  2156.         DW #D987
  2157.         DB %11100001,0
  2158.         DB %11111111,%11100000
  2159.         DB %00010000,%11100000
  2160.  
  2161. MNKEYS2
  2162.         DW #D8E8
  2163.         DB %11101100,0
  2164.         DB %11111111,0
  2165.         DB %00110010,0
  2166.  
  2167.         DW #D947
  2168.         DB %11000110,0
  2169.         DB %11111111,128
  2170.         DB %00111001,0
  2171.  
  2172.         DW #D9A8
  2173.         DB %11111000,0
  2174.         DB %11111110,0
  2175.         DB %00000100,0
  2176.  
  2177.         DW #DA07
  2178.         DB %11111100,0
  2179.         DB %11111111,#C0
  2180.         DB %00000011,0
  2181.  
  2182.         DW #DA6A
  2183.         DB %10011000,0
  2184.         DB %11111000,0,0,0
  2185.  
  2186. ;Конец игры
  2187. ENDGAME
  2188.        if EGA
  2189.         ld e,3+0x80 ;6912+keep
  2190.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  2191.         ld de,emptypal;standardpal
  2192.         OS_SETPAL
  2193.         xor a
  2194.         ld (egaon),a
  2195.         inc a
  2196.         ld (curscrnum_int),a
  2197.         ld e,a
  2198.         OS_SETSCREEN
  2199.        endif
  2200.         DI
  2201.         LD A,PG_MUZ
  2202.         CALL PAGE
  2203.         CALL MUTE
  2204. ;       CALL BLACK
  2205.         xor a
  2206.         ld (MUSONp1),a ;fix (Sergio)
  2207.  
  2208.         LD A,PG_MISC
  2209.         CALL PAGE
  2210.         LD HL,FINAL
  2211.         LD DE,#4000
  2212.         PUSH DE
  2213.         LD BC,FINLEN
  2214.         LDIR
  2215.         RET
  2216.  
  2217. ;Выход в ассемблер/Бейсик
  2218. EXIT
  2219.         EI
  2220.         HALT
  2221.         DI
  2222.          call swapimer
  2223.         ;LD A,16
  2224.         ;LD (PG_+1),A ;???
  2225.         LD A,PG_MUZ
  2226.         CALL PAGE
  2227.         CALL MUTE
  2228.         IM 1
  2229.         EI
  2230.         ld hl,0 ;result
  2231.         QUIT
  2232.  
  2233. ;Герой перемещается по карте.
  2234. ;Устанавливаем в какую сторону.
  2235. RUNING
  2236.         JR COUNT1 ;JR ROTATE команды меняются когда идет поворот
  2237. COUNT1  LD A,0  ;счетчик шагов героя
  2238.         INC A
  2239.         CP 4
  2240.         JR C,RH1
  2241.         XOR A
  2242. RH1     LD (COUNT1+1),A
  2243.         EX AF,AF' ;'
  2244.  
  2245. VUS     LD A,0
  2246.         AND A
  2247.         JP NZ,VUSE3     ;вещи
  2248.  
  2249. COUNT2  LD A,0  ;еще счетчик полного перемещения
  2250.                 ;из одной клетки в другую (он=16 т.к. карта
  2251.                 ;построена из клеток 2*2 знакоместа)
  2252.         INC A
  2253.         CP 16/STEPS
  2254.         JR C,RH2
  2255.         XOR A
  2256. RH2     LD (COUNT2+1),A
  2257.         CALL Z,NxtStep
  2258.         LD HL,(CrdHero+1) ;H-Y, L-X
  2259. NAPRAVL LD BC,0 ;приращение по направлению
  2260.         LD A,H
  2261.         DUP STEPS
  2262.         SUB B   ;изменение координат на опред. кол-во пикселей
  2263.         EDUP
  2264.         LD H,A
  2265.         LD A,L  ;Расчет новых координат
  2266.         DUP STEPS
  2267.         SUB C   ;в зависимости
  2268.         EDUP
  2269.         LD L,A  ;от направления движения героя
  2270.         LD (CrdHero+1),HL ;H-Y, L-X
  2271.  
  2272. ;Из группы одного направления героя (напрвлений всего 8)
  2273. ;выбираем 1 из 4 спрайтов в зависимости от 1-го счетчика шагов
  2274. SPRHERO LD HL,Right
  2275.         INC HL
  2276.         EX AF,AF' ;'
  2277.         ADD A,A
  2278.         LD C,A
  2279.         LD B,0
  2280.         ADD HL,BC
  2281. SH1     LD C,(HL)          ;BC=адрес нужного спрайта
  2282.         INC HL
  2283.         LD B,(HL)
  2284.         LD (SprHero+1),BC
  2285.         RET
  2286.  
  2287. ;Поворот героя, т.е. смена его направления
  2288. ROTATE  LD A,2 ;Из какого направления, сначала Вера стоит вправо
  2289. Prev    LD B,2 ;в какое направление нужно придти
  2290. RotMod  NOP    ;в какую сторону вертимся (INC A/DEC A)
  2291.         CP 255
  2292.         JR NZ,R1
  2293.         LD A,7
  2294. R1      CP 8
  2295.         JR C,R2
  2296.         XOR A
  2297. R2      LD (ROTATE+1),A
  2298.         CP B
  2299.         LD B,A
  2300.         JR NZ,R3
  2301.         XOR A            ;Если предыд. значение направления
  2302.         LD (RUNING+1),A  ;и настоящее стали равны,
  2303. R3      LD A,B           ;значит поворот закончен
  2304.         ADD A,A
  2305. ;Выбираем из таблички нужный спрайт и печатаем его
  2306.         LD HL,RotTabl
  2307.         LD C,A
  2308.         LD B,0
  2309.         ADD HL,BC
  2310.         JR SH1
  2311. ;H-y, L-x
  2312. ;Расчитываем следующий шаг, а так же направление героя
  2313. NxtStep
  2314.         LD A,PG_MAP
  2315.         CALL PAGE
  2316.  
  2317. PATHadr LD HL,0    ;Путь содержит направления
  2318.                    ;по которым перемещается герой
  2319.         LD A,(HL)  ;Направление
  2320.         LD B,A
  2321.         INC A
  2322.         JP Z,EndStep      ;если A=255, то герой достиг цели!
  2323.         DEC HL
  2324.         LD (PATHadr+1),HL ;запоминаем адрес след. направл.
  2325.         LD A,(HL)
  2326.         LD (OLDpath),A
  2327.  
  2328.         LD A,B
  2329.         LD D,B
  2330.         CALL NAPR
  2331.         LD (NAPRAVL+1),BC ;Сохраняем приращение по направлению
  2332.         LD HL,(HEROCRD)
  2333.         LD A,H
  2334.         SUB B
  2335.         LD B,D
  2336.         LD D,A
  2337.         LD A,L  ;Расчет новых координат
  2338.         SUB C   ;в зависимости
  2339.         LD E,A  ;от направления движения героя
  2340.  
  2341.         LD A,B
  2342. ROTAT   LD HL,VeraTab
  2343.         ADD A,A     ;A=A*9
  2344.         ADD A,A
  2345.         ADD A,A
  2346.         ADD A,B
  2347.         LD C,A
  2348.         LD B,0
  2349.         ADD HL,BC ;HL=адресу таблицы группы спрайтов
  2350.         LD B,(HL)
  2351.  
  2352.         LD A,(ROTATE+1) ;Предыдущее направление героя
  2353.         LD C,A
  2354.         CP B
  2355.         JR NZ,ROT
  2356. INIT    LD (SPRHERO+1),HL
  2357.         LD (HEROCRD),DE
  2358.         RET
  2359.  
  2360. ;в какую сторону вертеться
  2361. ROT     AND A
  2362.         LD A,B
  2363.         JR Z,P1
  2364.         LD A,C
  2365.         SUB B
  2366.         JR NC,P2
  2367.         NEG
  2368.  
  2369. P1      CP 5
  2370.         JR C,P0-2
  2371.         LD E,#3D ;DEC A
  2372.         JR P0
  2373.  
  2374. P2      CP 5
  2375.         LD E,#3D ;DEC A
  2376.         JR C,P0
  2377.         LD E,#3C ;INC A
  2378.  
  2379. P0      LD A,ROTATE-RUNING-2 ;изменяем код JR
  2380.         LD (RUNING+1),A
  2381. ;        LD A,E
  2382. ;P3      XOR 0       ;0/1 для колдовства Зловетом
  2383.        ld a,(P3p1) ;0/1 для колдовства Зловетом
  2384.        xor e
  2385.         LD (RotMod),A
  2386.  
  2387.         LD A,B
  2388.         LD (Prev+1),A
  2389.  
  2390.         LD HL,(PATHadr+1)
  2391.         INC HL
  2392.         CALL ES2
  2393.         POP HL  ;лишний POP для выхода из NextStep
  2394.         JP ROTATE
  2395.  
  2396. ;Это был последний шаг. Герой достиг цели!
  2397. EndStep
  2398.         POP AF ;лишний POP для выхода из процедуры NxtStep
  2399.         XOR A
  2400.         LD (RunHero+1),A
  2401.         LD (FTASK),A
  2402. ES2     LD (PATHadr+1),HL
  2403.         LD A,STEP1
  2404.         LD (COUNT2+1),A
  2405.         LD A,STEP2
  2406.         LD (COUNT1+1),A
  2407.         RET   ;Выход из процедуры RUNING
  2408.  
  2409. ;Приводим абсолютные координаты героя
  2410. ;в пиксельные для печати на экране
  2411. ;H-Y, L-X
  2412. Abs_Pix LD HL,(HEROCRD) ;координаты ног героя на карте
  2413.         LD A,H
  2414.         ADD A,A ;A=A*16
  2415.         ADD A,A
  2416.         ADD A,A
  2417.         ADD A,A
  2418.         SUB 16  ;т.к. нам нужно получить координаты головы героя
  2419.         LD H,A
  2420.  
  2421.         LD A,L
  2422.         ADD A,A ;A=A*16
  2423.         ADD A,A
  2424.         ADD A,A
  2425.         ADD A,A
  2426.         LD L,A
  2427.         RET
  2428.  
  2429. ;курсор вне мешка
  2430. VNE     LD A,(F3+1)
  2431.         AND A
  2432.         RET Z
  2433.         XOR A
  2434.         LD (F3+1),A
  2435. VNE2    LD A,(PRTIME+1)
  2436.         AND A
  2437.         RET NZ
  2438.         LD (CLT+1),A
  2439.         CPL
  2440.         LD (SVER+1),A
  2441.         RET
  2442.  
  2443. ;выбор вещи курсором из мешка
  2444. VMESH
  2445.         LD A,H      ;X
  2446.         CP MAX_X
  2447.         JR NC,VNE
  2448.         SUB 200
  2449.         JR C,VNE
  2450.         CALL DIV24 ;b=A/24
  2451.         LD A,B
  2452.         CP 2
  2453.         JR NC,VNE
  2454.         LD D,A ;X
  2455.         LD A,L      ;Y
  2456.         CP 30
  2457.         JR C,VNE
  2458.         CP 94
  2459.         JR NC,VNE
  2460.         SUB 28
  2461.         JR C,VNE
  2462.         CALL DIV24 ;b=A/24
  2463.         LD A,B
  2464.         CP 3
  2465.         JR NC,VNE
  2466.  
  2467.         ADD A,A;Y
  2468.         ADD A,D
  2469.         LD E,A
  2470.         LD D,0
  2471.  
  2472.         LD HL,(MSTRT+2)
  2473.         ADD HL,DE
  2474.         LD (VADR+1),HL;адрес вещи на которой стоит курсор
  2475.         LD A,1
  2476.         LD (F3+1),A   ;курсор в мешке!
  2477.  
  2478.         LD B,(HL);номер вещи из мешка на кот. стоит курсор
  2479.  
  2480. ;печать названия вещи:A-код вещи
  2481. PRVESH
  2482.         LD A,(PRTIME+1)
  2483.         AND A
  2484.         RET NZ
  2485.  
  2486. ;Чтобы одно и тоже название не печаталось дважды
  2487. SVER    LD A,255 ;предыд. вещь на котор. стоял курсор
  2488.         CP B
  2489.         JR Z,SV2
  2490.         LD A,B
  2491.         LD (SVER+1),A
  2492.  
  2493.         ADD A,A
  2494.         LD E,A
  2495.         LD D,0
  2496.         LD HL,V
  2497.         ADD HL,DE
  2498.         LD E,(HL)
  2499.         INC HL
  2500.         LD D,(HL) ;DE-название вещи
  2501.         LD (PRT+3),DE
  2502.         XOR A
  2503.         LD (CLT+1),A
  2504.         LD (PRT+1),A
  2505. SV2     INC A
  2506.         RET
  2507.  
  2508. ;Стирание области под текстом
  2509. CLADR=#C8D9
  2510. CLADR2=#C8F9
  2511.  
  2512. CLTXT
  2513. ;in IM2
  2514.        if EGA
  2515.         ld hl,scrbase+(40*112)+#19
  2516.         ld bc,0x1018
  2517.         ld e,0x3f ;color 7 ;0xc9 ;color 9
  2518. ;b=hgt,c=wid (/2)
  2519. ;de=gfx
  2520. ;hl=scr
  2521.         jp climgega
  2522.        else
  2523.         LD HL,0
  2524.         DUP 8
  2525.         LD (CLADR),HL
  2526.         LD (CLADR+2),HL
  2527.         LD (CLADR+4),HL
  2528. CLADR=CLADR+256
  2529.         EDUP
  2530.  
  2531.         DUP 8
  2532.         LD (CLADR2),HL
  2533.         LD (CLADR2+2),HL
  2534.         LD (CLADR2+4),HL
  2535. CLADR2=CLADR2+256
  2536.         EDUP
  2537.         RET
  2538.        endif
  2539.  
  2540. ;Увеличение скорости обновления экрана
  2541. ;Заметно ТОЛЬКО в режиме Турбо компьютера
  2542. TURBO
  2543.         LD HL,MAPINGp4
  2544.         LD A,FRAME
  2545.         DEC (HL)
  2546.         JR Z,$+4
  2547.         LD A,1
  2548.         LD (HL),A
  2549.         JR KOF
  2550.  
  2551. ;скрытый режим
  2552. STEAL
  2553.         LD A,(CHANGE)
  2554.         AND A
  2555.         JP NZ,KOF
  2556.  
  2557.         LD A,#FB
  2558.         IN A,(#FE) ;SS/CS+T
  2559.         BIT 4,A
  2560.         JR Z,TURBO
  2561.  
  2562.         LD H,27
  2563.         LD A,#F7
  2564.         IN A,(#FE) ;SS/CS+3/4-листание вверх/вниз
  2565.         BIT 2,A
  2566.         JR Z,VLST
  2567.         INC H
  2568.         BIT 3,A
  2569.         JR Z,VLST
  2570.         BIT 0,A
  2571.         JP Z,SKIP  ;промотка диалога
  2572.  
  2573.         LD A,#BF
  2574.         IN A,(#FE)  ;SS/CS+J/K - перелет героя - J
  2575.                     ;границы скролла - K
  2576.         AND 12
  2577.         CP 12
  2578.         JR Z,RMOUS
  2579.         BIT 2,A
  2580.         JR Z,BORDER
  2581.  
  2582.         LD A,(RunHero+1)
  2583.         AND A
  2584.         JR NZ,RMOUS
  2585.  
  2586. STPIN   LD A,0
  2587.         INC A
  2588.         CP 8
  2589.         JR C,STN1
  2590.         XOR A
  2591. STN1    LD (STPIN+1),A
  2592.         ADD A,A
  2593.         LD HL,CRDJP
  2594.         LD E,A
  2595.         LD D,0
  2596.         ADD HL,DE
  2597.         LD E,(HL)
  2598.         INC HL
  2599.         LD D,(HL)
  2600.         LD (HEROCRD),DE
  2601. STN2    LD A,PG_MAP
  2602.         CALL PAGE
  2603.         CALL CENTR2
  2604.         JR KOF
  2605. RMOUS   LD A,32    ;имит. прав. клавишу мыши
  2606.         JP MKEYSp2
  2607.  
  2608. CRDJP   DW #3906 ;Домой
  2609.         DW #0537 ;к Зловету
  2610.         DW #2F1B ;к Аленушке
  2611.         DW #3236 ;к Хевору
  2612.         DW #2807 ;к Петро
  2613.         DW #1908 ;к Кузнецу
  2614.         DW #0407 ;к Фекле;
  2615.         DW #1E32 ;к библиотекарю
  2616.  
  2617. ;Удаление границ скроллир. карты (герой может уходить за экран)
  2618. BORDER  LD A,(MODscrl+1)
  2619.         XOR 1
  2620.         LD (MODscrl+1),A
  2621.         JR KOF
  2622.  
  2623. ;Листание вещей от клавиш
  2624. VLST
  2625.         CALL VLIST
  2626. KOF     LD A,201
  2627.         LD (CHANGE),A
  2628.         JP MKY
  2629.  
  2630. ;Изменение каких-либо параметров от клавиш
  2631. CHANGE
  2632.         NOP ;RET
  2633.         EX AF,AF' ;'
  2634.         LD A,201
  2635.         LD (CHANGE),A
  2636.         EX AF,AF' ;'
  2637.         RRA
  2638.         JR NC,MUS_ONOF ;"1"
  2639.         RRA
  2640.         JR NC,SNDONOF  ;"2"
  2641.         RRA
  2642.         RET C
  2643. ;Вкл/откл мышки - клавиша "3"
  2644. MS_ONOF LD HL,mouse+1
  2645.         LD A,(HL)
  2646.         CPL
  2647.         LD (HL),A
  2648.         RET
  2649.  
  2650. ;Вкл/откл звуков
  2651. SNDONOF LD A,PG_MAP
  2652.         CALL PAGE
  2653.         LD HL,SOUND
  2654.         LD A,201
  2655.         XOR (HL)
  2656.         LD (HL),A
  2657.         LD HL,SND_TSK
  2658.         LD (SAMPLE+1),HL
  2659.         CALL NZ,AY_OFF
  2660.         RET
  2661.  
  2662. ;Вкл/откл музыки
  2663. MUS_ONOF
  2664.         HALT
  2665.         LD A,(MUSONp1)
  2666.         XOR 1
  2667.         LD (MUSONp1),A
  2668.         DI
  2669.         LD A,PG_MUZ
  2670.         CALL PAGE
  2671.         CALL MUTE
  2672.         EI
  2673.         RET
  2674.  
  2675. ;Изменение громкости мелодии
  2676. VOLCH
  2677.         LD B,#FF
  2678.         NOP
  2679.         LD A,PG_MUZ
  2680.         CALL PAGE
  2681.         LD HL,VOLUME
  2682.         LD A,(HL)
  2683.         ADD A,B
  2684.         CP -16
  2685.         JR Z,MUSNXT
  2686.         CP 1
  2687.         JR Z,STPVOL
  2688.         LD (HL),A
  2689.         RET
  2690.  
  2691. STPVOL  LD HL,#C9FF
  2692.         LD (VOLCH+1),HL
  2693.         RET
  2694.  
  2695. MUSNXT2 XOR A
  2696.         LD (VOLCH+2),A
  2697.         RET
  2698.  
  2699. ;Переход на след. мелодию
  2700. MUSNXT
  2701.         LD A,(MUSNUM)
  2702.         LD B,A
  2703.         LD A,PG_MUZ
  2704.         CALL PAGE
  2705.         LD A,B
  2706.         INC A
  2707.         CP 6   ;кол-во мелодий
  2708.         JR C,$+3
  2709.         XOR A
  2710.         LD (MUSNUM),A
  2711.         LD HL,MUSTAB
  2712.         ADD A,A
  2713.         LD E,A
  2714.         LD D,0
  2715.         ADD HL,DE
  2716.         LD E,(HL)
  2717.         INC HL
  2718.         LD D,(HL)
  2719.         EX DE,HL
  2720.         LD DE,MUSIC
  2721.         CP 10
  2722.         JR NZ,$+5
  2723.         LD DE,#C000
  2724.         PUSH DE
  2725.         EI
  2726.         HALT
  2727.         CALL DEHRUST
  2728.         POP HL
  2729.         LD DE,100
  2730.         AND A
  2731.         SBC HL,DE
  2732.         DI
  2733.         CALL PLAY ;инициал. мелод.
  2734.         EI
  2735.         LD HL,#0001
  2736.         JR STPVOL+3
  2737.  
  2738. MUSTAB  DW MUSM,MUS0,MUS1,MUS2,MUS3,MUSF
  2739.  
  2740. CLRMK   XOR A
  2741.         LD (MKEYSp1),A
  2742.         RET
  2743. FIRE
  2744.         CALL CLRMK
  2745.         CALL GMEN
  2746.         LD A,(DIALOG+1) ;открыто ли окно диалога?
  2747.         AND A
  2748.         JP NZ,TALKING
  2749.  
  2750. ;использование вещей
  2751. F3      LD A,0      ;если не ноль, то курсор в мешке
  2752.         AND A
  2753.         JR Z,F4
  2754. VADR    LD HL,0
  2755.         LD A,(KARM) ;если вещей в руке нет, значит берем
  2756.         LD D,(HL)
  2757.         AND A
  2758.         JR NZ,VA1
  2759.         OR D
  2760.         RET Z
  2761.         XOR A
  2762.         JR F32      ;берем вещь
  2763. VA1     SUB 7
  2764.         DEC D
  2765.         INC D
  2766.         JR Z,F31    ;ложим
  2767.  
  2768. ;применяем вещь на вещь в мешке
  2769.         PUSH HL
  2770.         CALL SVOYST
  2771.         POP HL
  2772.         INC BC
  2773.         LD A,(BC)
  2774.         CP D
  2775.         JP NZ,NOTUSE ;нельзя применить
  2776.         INC BC
  2777.         LD A,(BC)
  2778.         CALL F31
  2779.         XOR A
  2780.         LD (F3+1),A
  2781.         INC BC
  2782.         LD A,(BC)
  2783.  
  2784.         LD HL,SND_OBJ
  2785.         LD (SAMPLE+1),HL
  2786.         JP TLSN
  2787.  
  2788. F31     LD D,-7
  2789. F32     LD (HL),A
  2790.         LD A,D
  2791.         ADD A,7
  2792.         LD (KARM),A
  2793.         LD (CCURS+1),A
  2794.         LD HL,INV+1 ;напеч. спрайты 3*3
  2795.         INC (HL)
  2796.         LD HL,SND_TK
  2797.         LD (SAMPLE+1),HL
  2798.         RET
  2799.  
  2800. F4      LD A,(VUS+1)
  2801.         AND A
  2802.         RET NZ
  2803.  
  2804.         CALL MANAGE
  2805.         LD A,B
  2806.         AND A
  2807.         JR Z,F41
  2808.         CP 5
  2809.         JP NZ,VUSE2
  2810.  
  2811. F41     LD HL,(mouse_crd);L-y,H-x
  2812.         CALL DIV8
  2813.         LD A,H ;X
  2814.         CP 24
  2815.         JR C,F5
  2816.         LD A,L ;Y  ;листание вещей в мешке
  2817.         CP 3
  2818.         RET NZ
  2819. VLIST
  2820.         CALL CLRMK
  2821.         LD A,H
  2822.         LD HL,(MSTRT+2)
  2823.         LD DE,6       ;шаг листания вещей: 1 вещь-1 байт
  2824.         LD BC,MESHOK
  2825.         SUB 27
  2826.         JR Z,VESHUP ;вверх
  2827.         DEC A
  2828.         JP Z,VESHDW ;вниз
  2829. ;reter
  2830.         RET
  2831.  
  2832. jpix
  2833.         jp (ix)
  2834.  
  2835. ;нажали огонь на игровом поле
  2836. PATH
  2837. F5      SRL H ;X
  2838.         SRL L ;Y
  2839.  
  2840.         LD (FTSK+1),HL
  2841.  
  2842. ;MG1     CALL MAG2-1   ;Зловет заколдовал
  2843.         ld ix,(curmagic)
  2844.         call jpix
  2845.  
  2846.         LD A,(curarrowtype) ;Если уже какой-то спрайт  сделан
  2847.         AND A ;???по идее надо проверять на 255!!! TODO
  2848.         JR NZ,F6
  2849.  
  2850. ;      LD A,PG_VIEW
  2851.         CALL PAGE_PG_VIEW
  2852.  
  2853.         PUSH HL
  2854.         CALL NP
  2855.         CALL Z,MASK
  2856.         POP HL
  2857.  
  2858. F6      LD D,L
  2859.         LD E,H
  2860.         LD HL,(DispMapX) ;H-Y, L-X
  2861.         ADD HL,DE
  2862. OLDC    LD DE,0
  2863.         LD (OLDC+1),HL
  2864.         EX DE,HL
  2865.         AND A
  2866.         SBC HL,DE
  2867.         RET Z      ;мы уже сюда тыкали
  2868.         LD HL,(HEROCRD)  ;H-Y, L-X
  2869.  
  2870. ;если герой перемещается, то останавливаем его
  2871.         LD A,(RunHero+1)
  2872.         AND A
  2873.         JR Z,NEWpath
  2874.         LD BC,OLDpath
  2875.         LD (PATHadr+1),BC
  2876.  
  2877. NEWpath LD A,PG_MAP
  2878. ;A=1
  2879.         LD (CLR_MAPp1),A ;для восстановления карты
  2880.         CALL PAGE
  2881. ;HL=(HEROCRD) ;H=Y,L=X
  2882. ;de=куда ;D=Y,E=X
  2883.         CALL SRCH_PATH
  2884.         LD A,(HL)
  2885.         INC A
  2886.         RET Z ;нет пути
  2887.         LD (RunHero+1),A
  2888.         LD (PATHadr+1),HL
  2889. F7
  2890.         LD A,201
  2891.         LD (FTASK),A
  2892.         RET
  2893.  
  2894. VESHUP  AND A
  2895.         SBC HL,DE
  2896.         SBC HL,BC
  2897.         RET C
  2898. VSH_    ADD HL,BC
  2899.         LD (MSTRT+2),HL
  2900.         LD HL,INV+1
  2901.         INC (HL)
  2902.  
  2903.         LD HL,SND_LST
  2904.         LD (SAMPLE+1),HL
  2905. NP
  2906.         LD A,(KARM)
  2907.         AND A
  2908.         RET NZ
  2909. NP2     LD A,1       ;визуальное нажатие курсором
  2910.         LD (CCURS+1),A
  2911.         RET
  2912.  
  2913. VESHDW  ADD HL,DE
  2914.         AND A
  2915.         SBC HL,BC
  2916.         LD A,L
  2917.         CP QVESH-4
  2918.         RET NC
  2919.         JR VSH_
  2920.  
  2921. ;Упак. тексты диалогов
  2922.        if MEGALZ
  2923.         include "unmegalz.asm" ;DEC40
  2924.        
  2925. GL      INCBIN "gleb.mlz"
  2926. ZL      INCBIN "zlovet.mlz"
  2927. HV      INCBIN "hevor.mlz"
  2928. BK_     INCBIN "bukvin.mlz"
  2929. JO      INCBIN "jora.mlz"
  2930. PT      INCBIN "petro.mlz"
  2931. AL      INCBIN "alena.mlz"
  2932. FK      INCBIN "fekla.mlz"
  2933. ZD_     INCBIN "zadolb.mlz"
  2934. RP      INCBIN "replic.mlz"
  2935.        else ;HRUST2
  2936. GL      INCBIN "GLEB.p"
  2937. ZL      INCBIN "ZLOVET.p"
  2938. HV      INCBIN "HEVOR.p"
  2939. BK_     INCBIN "BUKVIN.p"
  2940. JO      INCBIN "JORA.p"
  2941. PT      INCBIN "PETRO.p"
  2942. AL      INCBIN "ALENA.p"
  2943. FK      INCBIN "FEKLA.p"
  2944. ZD_     INCBIN "ZADOLB.p"
  2945. RP      INCBIN "REPLIC.p"
  2946.        endif
  2947.  
  2948. SPRMENU
  2949.        INCBIN "GAMEMEN4.C" ;спрайт меню
  2950.  
  2951. ENDPROG ;EQU SPRMENU+1248
  2952.  
  2953.         page PG_MAP
  2954. MAP     EQU #C000
  2955.        if 1==1
  2956.         org 0xc000
  2957.        if EGA
  2958.         incbin "map.dat"
  2959.        else
  2960.         incbin "map6912.dat"
  2961.        endif
  2962.         incbin "mapflags.dat"
  2963.        endif
  2964. MASSIVE EQU MAP+8192
  2965.         ORG MASSIVE+4096;,PG_MAP
  2966. DNPK
  2967.        INCBIN "Day_nght.p" ;467 Упакован. спрайт дня и ночи
  2968.         ;page PG_MAP
  2969.         ;ORG DNPK+467;,PG_MAP
  2970.         INCLUDE "SCRIPTS.asm" ;Скрипты
  2971.  
  2972. SRCH_PATH
  2973.         INCLUDE "PATH-48H.asm" ;поиск пути 531 байт
  2974. stack   DS 4*(DX_MAP+DY_MAP)   ;+ 512 б буфер
  2975.                                ;итого 1043 байта
  2976.  
  2977.         ;DISPLAY /H,/T,MMENU
  2978.         ;DISPLAY /H,/T,mouse+1
  2979.         ;DISPLAY /H,/T,ROLL
  2980.         ;DISPLAY /H,/T,SCANTYP+1
  2981.         ;DISPLAY /H,/T,MSPEED+1
  2982.         ;DISPLAY /H,/T,MUSONp1
  2983.         ;DISPLAY /H,/T,SOUND
  2984.  
  2985. LN_MISC EQU $-#C000
  2986. MISCFRE EQU #FFFF-$
  2987. LN_MAP  EQU stack-DNPK
  2988.  
  2989.         DISPLAY "PG_MISC FREE=",MISCFRE
  2990.         DISPLAY "PG_MAP FREE = ",#FFFF-stack-512
  2991.         ;DISPLAY "Старт = ",IM2
  2992.         ;DISPLAY "Дл. = ",ENDPROG-IM2
  2993. ;       DISPLAY "Дл. текстов = ",NOTUSE-GL
  2994. ;       DISPLAY "Дл. Скриптов = ",SND-RUN_Q
  2995.         DISPLAY "Свободно = ",#C000-ENDPROG
  2996.         ;DISPLAY "Переменные = ",IM2-VARS
  2997.  
  2998. MAPMAS  EQU #C000
  2999. KSCR    EQU MAPMAS+4053
  3000. BKEY    EQU KSCR+3673
  3001. ABOUTS  EQU BKEY+4267  ;Об игре,авторах
  3002. FINPACK EQU ABOUTS+1781
  3003. ;LODSAV  EQU FINPACK+1787
  3004.         page PG_MISC
  3005.         ORG #C000;,PG_MISC
  3006. TEXT    ;куда распак. текст
  3007.        INCBIN "MapMass.p"  ;4053 ;упакованная карта (распаковывается в PG_MAP), потом запарывается текстом текущего диалога
  3008.        INCBIN "KeyScr4.plc"  ;3673
  3009.        INCBIN "BELLKEY4.plc" ;4267
  3010.        INCBIN "ABOUTY.p"   ;1781
  3011.        INCBIN "BVssVMft.p" ;1787 ;анимация финала
  3012.         ;DISP #5800
  3013.         ;INCLUDE "saveload.asm" ;Загрузка/запись состояния игры
  3014.         ;ENT
  3015. ;LENLS   EQU $-LODSAV
  3016. FINAL   INCLUDE "FINAL.asm" ;Финал игры
  3017.  
  3018.         page PG_SPR
  3019.         ORG #C000;,PG_SPR
  3020.        if EGA
  3021.        include "cursors.ast" ;276 (0x114) байт на курсор
  3022.        ;include "hud.ast"
  3023. SPR=0xc000 ;чисто для вычислений по тайлам (потом при выводе пересчитываются)
  3024.        else
  3025. SPR
  3026.        INCBIN "SPRITEMh.C" ;16384
  3027.        endif
  3028.  
  3029.         page PG_HERO
  3030.         ORG #C000;,PG_HERO
  3031.        if !EGA
  3032. hero
  3033. VIDS    EQU hero+6144
  3034.        INCBIN "HeroSprX.C" ;6144
  3035.        else
  3036. hero=0;0x8000/4
  3037. VIDS
  3038.        endif
  3039.        INCBIN "VIDEO.p" ;упак. видео=10202, распак.=12132
  3040.        
  3041.         page PG_MUZ
  3042.         ORG #C000+5782;,PG_MUZ
  3043. PLAY
  3044. MUTE    EQU PLAY+5
  3045. VOLUME  EQU PLAY+10
  3046. MUSM    EQU PLAY+2139
  3047. MUS0    EQU MUSM+912
  3048. MUS1    EQU MUS0+722
  3049. MUS2    EQU MUS1+413
  3050. MUS3    EQU MUS2+1074
  3051. MUSF    EQU MUS3+1161
  3052. VARSPK  EQU MUSF+3099
  3053. MUSIC   EQU #C000+3222
  3054.  
  3055.         page PG_MUZ
  3056.         ;ORG MUSIC
  3057.         ;incbin "Menu.m--"
  3058.         ORG PLAY-824;,PG_MUZ
  3059. INTRO
  3060.        INCBIN "B1_otrez.m--";Мелодия для интро
  3061.        INCBIN "PLAYERX.C" ;Плеер музыки
  3062.        INCBIN "Menu.p"
  3063.        INCBIN "vera_00.p"
  3064.        INCBIN "vera_01.p"
  3065.        INCBIN "vera_02.p"
  3066.        INCBIN "vera_03.p"
  3067.        INCBIN "russia80.p"
  3068.        ;INCBIN "VARS_PAK.p" ;1020
  3069.  
  3070. LN_MUZ  EQU VARSPK+1020-INTRO
  3071. LN_HERO EQU 6144+10202
  3072.  
  3073.         page PG_VIEW
  3074.         ORG #C000+6912;,PG_VIEW
  3075. FNT
  3076. SPR33   EQU FNT+2048
  3077. wasARROWS  EQU SPR33+3456
  3078. VIEW    EQU wasARROWS+szARROWS
  3079. NG_MASK EQU VIEW+1039
  3080. WIN_SPR EQU NG_MASK+384 ;буфер 192 б
  3081. NG      EQU WIN_SPR+496 ;сюда распак. спрайт дня и ночи
  3082. ;REZULT  EQU #5802 ;буфер 192 б
  3083.        INCBIN "4AXORFIX.F" ;2048 фонт Pulsar'а
  3084.       if EGA
  3085.        ds 3456
  3086.       else
  3087.        INCBIN "spr3x3.C"  ;3456 ;TODO убить в EGA
  3088.       endif
  3089.        ds 1440 ;INCBIN "spr2x2x.C" ;1440 ;стрелки нужны для меню
  3090.       if EGA
  3091.        ds 1039+384+496
  3092.       else
  3093.        INCBIN "IFACE.plc"   ;1039 ;TODO убить в EGA
  3094.        INCBIN "Ngh_arr3.C" ;384 Спрайт маски и стрелки по OR ;TODO убить в EGA
  3095.        INCBIN "WIN_SPR.C" ;496 Спрайт окна диалога ;TODO убить в EGA
  3096.       endif
  3097.  
  3098. LN_VIEW EQU NG-FNT
  3099.  
  3100.         page PGHUD
  3101.         org 0xc000
  3102.         include "hud.ast"
  3103. szhud=$-0xc000
  3104.  
  3105.         page PGDAYNIGHT
  3106.         org 0xc000
  3107.         include "daynight.ast"
  3108. ;hudmenu
  3109.         include "hudmenu.ast"
  3110. szdaynight=$-0xc000
  3111.  
  3112. ;Для сохранения содержимого всех страниц
  3113. ;раскомментировать и запустить:RUN SOBJ
  3114. ;       ORG SPRMENU
  3115. ;SOBJ   INCLUDE "SAVEOBJ"
  3116.  
  3117.         ;ORG MMENU ;start here
  3118.  
  3119.         ;savebin "VERAVARS.C",VARS,endvars-VARS
  3120.  
  3121.        if RUS
  3122.         savebin "vera.com",begin,ENDPROG-begin
  3123.         savebin "vera/vars.bin",VARS,0x600
  3124.        else
  3125.         savebin "veraeng.com",begin,ENDPROG-begin
  3126.         savebin "vera/varseng.bin",VARS,0x600
  3127.        endif
  3128.  
  3129.         page PG_SPR
  3130.         savebin "vera/0_page.bin",SPR,16384
  3131.         page PG_MAP
  3132.        if RUS
  3133.         savebin "vera/1_page.bin",0xc000,LN_MAP+0x3000;,DNPK,LN_MAP
  3134.        else
  3135.         savebin "vera/1_pageng.bin",0xc000,LN_MAP+0x3000;,DNPK,LN_MAP
  3136.        endif
  3137.         ;savebin "vera/1_page.bin",DNPK,LN_MAP
  3138.         page PG_MISC
  3139.        if RUS
  3140.         savebin "vera/3_page.bin",0xc000,LN_MISC
  3141.        else
  3142.         savebin "vera/3_pageng.bin",0xc000,LN_MISC
  3143.        endif
  3144.         page PG_HERO
  3145.         savebin "vera/4_page.bin",0xc000,LN_HERO
  3146.         page PG_MUZ
  3147.         savebin "vera/6_page.bin",0xc000,0x4000;INTRO,LN_MUZ
  3148.         page PG_VIEW
  3149.         savebin "vera/7_page.bin",FNT,LN_VIEW
  3150.         page PGHUD
  3151.         savebin "vera/hud.bin",0xc000,szhud
  3152.         page PGDAYNIGHT
  3153.         savebin "vera/daynight.bin",0xc000,szdaynight
  3154.  
  3155.         LABELSLIST "../../../us/user.l"
  3156.  
  3157.        display "HEROCRD=",HEROCRD
  3158.  
  3159.