?login_element?

Subversion Repositories NedoOS

Rev

Rev 922 | Rev 932 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

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