Subversion Repositories NedoOS

Rev

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