Subversion Repositories NedoOS

Rev

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