Subversion Repositories NedoOS

Rev

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

  1.         device zxspectrum1024
  2.  
  3.         include "settings.ast"
  4. MEM128=ATM;1 ;TODO автоопределение 48/128?
  5.  
  6.        if ATM
  7.         include "../../_sdk/sys_h.asm"
  8.        endif
  9.  
  10. STICKMOUSEXTOGRID=!ATM;1
  11.  
  12. FASTMAPPER=0 ;выброшено
  13. CEILING=0 ;с потолком 8K лишних, только при FASTMAPPER=0
  14.  
  15. Nobjects=16+4 ;16 worms + 4 mines
  16.  
  17.        if ATM
  18. STACK=0x4000
  19. UVSCROLL_USETILES=0
  20. UVSCROLL_USEBMP=0
  21.        else
  22. STACK=0x6000
  23.        endif
  24.  
  25. FD      EQU 0x7ffd
  26. COLOUR  EQU 7
  27. TITLCOL EQU 71
  28.  
  29. PGMASK_  EQU #17
  30.        if MEM128
  31. MASK=0xf000 ;(MAPWID/2)*((256-8)/2+1[временно для mkmap]) = 46*125 = 5750
  32.        else
  33. MASK=0xb000 ;(MAPWID/2)*(TERRAINHGT/2+1[временно для mkmap]) = 46*79 = 3634 ;TODO в 128K тут будет потолок карты (80*93=7440)
  34.        endif
  35.        if !ATM
  36. PGMAP=0x10
  37.        endif
  38. PGHICODE=0x14
  39. PGLMN=0x16
  40. ;LMNS    EQU #C000 ;for mkmap
  41. NLMN=15 ;число всех элементов фона в LMNS
  42. NLMNONMAP=5 ;число элементов, которые ставим на карту
  43.  
  44. ;USELMNBUF=0
  45. ;       if USELMNBUF
  46. ;LMNBUF=0x4000 ;во время построения карты
  47. ;LMNSZ=0x0800
  48. ;       else
  49.        if !ATM
  50. LMNGFX=0x4000 ;здесь будут лежать только те элементы, которые точно хотим ставить (тогда можем перестроить карту и в 48K)
  51. LMNGFXSZ=0x0800 ;не более стольких байт, иначе число элементов будет урезано (а по умолчанию MLMNONMAP штук)
  52.        endif
  53. ;       endif
  54.  
  55. MAPWID   EQU 93 ;нечётная! т.к. маска без 4 пикс слева и 4 пикс справа - там червей нельзя ставить ;TODO а если червь влетит в стену на левой границе карты? надо полную маску или при любой порче ландшафта крайний левый пикс маски формировать из 5 левых пикс, справа аналогично?
  56. MASKWID  EQU MAPWID/2 ;округление вниз (x в маске считается для центра червя, x=0 соответствует x=4 в карте)
  57. XWID=MAPWID*2 ;максимальное значение координаты xhigh
  58. XWIDCHRBITS=1
  59. XWIDCHR=1<<XWIDCHRBITS;2 ;одно знакоместо смещает xhigh вот на столько
  60. INVISIBLEX=220 ;xhigh между 186 и 255, чтобы даже бомба не задела стоящих там трупов
  61.  
  62. MAPHGT  EQU 22*8 ;высота карты в пикселях
  63. TERRAINHGT = MAPHGT-20 ;высота генерируемой карты в пикселях ;чтобы уместить червей и надписи сверху ;защита от вставания на идеально высокого червя - отсутствие маски для строк выше
  64. MASKHGT EQU MAPHGT/2 ;высота маски в пикселях
  65. BIGMAPHGT EQU 256 ;с небом
  66. SKYHGT=BIGMAPHGT-MAPHGT ;высота неба
  67. SKYMASKHGT=SKYHGT/2
  68.  
  69.        if ATM
  70. RAMKAX=5
  71.        else
  72. RAMKAX=1
  73.        endif
  74. RAMKAHGT=16
  75. RAMKAWID=14
  76. SCRTOP=#4061 ;левый верхний угол активной зоны экрана
  77. SCRHGT=17*8 ;высота активной зоны экрана в пикселях
  78.        if ATM
  79. SCRWID=40 ;ширина активной зоны экрана в знакоместах
  80. TITLEY=200-32-8
  81.        else
  82. SCRWID=30 ;ширина активной зоны экрана в знакоместах
  83. TITLEY=128
  84.        endif
  85. ;SHADWD=SCRWID+2
  86. ;SHADHGT=SCRHGT;+14?
  87. WATERHGT=32 ;высота воды в пикселях дополнительно к высоте карты с небом (BIGMAPHGT)
  88. ;для мыши:
  89. waterYwin=BIGMAPHGT-SCRHGT ;waterYwin - это где высота воды 0
  90. maxYwin=waterYwin+WATERHGT ;waterYwin+WATERHGT - это где высота воды WATERHGT
  91. maxXwin=(MAPWID-SCRWID)*8
  92.  
  93. ;DOPRSZ  EQU 56
  94. ;UPPRSZ  EQU SCRHGT-DOPRSZ
  95. ;DOPRSCR EQU -(DOPRSZ*4)+#4981
  96.  
  97. MAP=0xc000 ;там лежит карта в PGMAP
  98. MAPDO   EQU -(MAPWID*SKYHGT)+MAP ;виртуальный адрес начала карты, включая небо
  99. MASKDO  EQU -(MASKWID*(SKYMASKHGT-4))+MASK ;виртуальный адрес начала маски, включая небо ;маска - под ногами червя (высота червя=8, в маске =4)
  100.  
  101. MASKSZ  EQU MAPHGT/2*MASKWID
  102.  
  103.        if ATM
  104. INTSTACK=0x3f80
  105.        else
  106. INTSTACK=0x5c00
  107.        endif
  108. ;SPOILSTACK=INTSTACK+2 ;2 bytes for drawmap
  109.  
  110.        if ATM
  111. uvscroll_scrbase=0x4000+(24*40)
  112. uvscroll_pushbase=0x8000
  113. uvscroll_callbase=0xc000
  114.  
  115. UVSCROLL_WID=1024
  116. UVSCROLL_HGT=256;512;256
  117. SKIPPGS=0;16 ;0 for UVSCROLL_HGT=256
  118. UVSCROLL_SCRWID=SCRWID*8;320 ;8*(TILEMAPWID-2)
  119. UVSCROLL_SCRHGT=136;200;192-16 ;(делится на 16!!!) ;8*(TILEMAPHGT-2) ;чтобы выводить всегда 12 метатайлов (3 блока по 8) по высоте
  120. UVSCROLL_NPUSHES=UVSCROLL_WID/2/4/2
  121. UVSCROLL_SCRNPUSHES=UVSCROLL_SCRWID/2/4/2
  122.  
  123. UVSCROLL_SCRSTART=uvscroll_scrbase+((UVSCROLL_SCRHGT-1)*40)
  124. UVSCROLL_LINESTEP=-40
  125.  
  126. UVSCROLL_NCALLPGS=4
  127.        
  128.         macro SETPGPUSHBASE
  129.         SETPG8000
  130.         endm
  131.  
  132.         macro RECODEBYTE
  133.         ld a,(de)
  134.         ld ($+4),a
  135.         ld a,(trecodebyteright)
  136.         ld c,a
  137.         dec de
  138.         ld a,(de)
  139.         dec de
  140.         ld ($+4),a
  141.         ld a,(trecodebyteleft)
  142.         or c
  143.         endm        
  144.  
  145.        endif
  146.  
  147.  
  148.        macro SCRADDR x,y ;x in chr, y in pix
  149.        if ATM
  150. _=0x4000+((y)*40)+(x)
  151.        else
  152. _=0x4000+(((y)&7)<<8)+(((y)&0x38)<<2)+(((y)&0xc0)<<5)+(x)
  153.        endif
  154.        endm
  155.  
  156.         page 0
  157.        if ATM
  158.         org PROGSTART
  159.        else
  160.         ORG 0x6000
  161.        endif
  162. begin
  163.        if ATM
  164.         ld sp,STACK
  165.        
  166.         ld e,0+128 ;+128=keep
  167.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  168.  
  169.         ld e,0
  170.         OS_SETSCREEN
  171.         ld e,0 ;color byte
  172.         OS_CLS
  173.         ld e,1
  174.         OS_SETSCREEN
  175.         ld e,0 ;color byte
  176.         OS_CLS
  177.  
  178.         OS_NEWPAGE
  179.         ld a,e
  180.         ld (pg1),a
  181.         OS_NEWPAGE
  182.         ld a,e
  183.         ld (pg2),a
  184.  
  185.         OS_GETMAINPAGES
  186. ;dehl=номера страниц в 0000,4000,8000,c000
  187.         ld a,e
  188.         LD (pgmain4000),A
  189.         ld a,h
  190.         LD (pgmain8000),A
  191.         ld a,l
  192.         ld (pgmask),a
  193.         ld de,res_path
  194.         OS_CHDIR
  195.  
  196.         call SetPgTexture8000
  197.         ld de,fnpg1
  198.         call loadfile8000
  199.  
  200.         call SetPgLmn8000
  201.         ld de,fnpg2
  202.         call loadfile8000
  203.  
  204.         call setpgsmain40008000
  205.  
  206.         ;call cls
  207.         call swapimer
  208.  
  209.         call uvscroll_prepare
  210.         jp GO
  211.  
  212. loadfile8000
  213.         call openstream_file
  214.         ld de,0x8000
  215.         ld hl,0x4000
  216.         call readstream_file
  217.         jp closestream_file
  218.        
  219. ;bgxyfilename
  220. ;        db "bg8-16d.bmp",0
  221.  
  222. swapimer
  223.         di
  224.         ld de,0x0038
  225.         ld hl,oldimer
  226.         ld bc,3
  227. swapimer0
  228.         ld a,(de)
  229.         ldi ;[oldimer] -> [0x0038]
  230.         dec hl
  231.         ld (hl),a ;[0x0038] -> [oldimer]
  232.         inc hl
  233.         jp pe,swapimer0
  234.         ei
  235.         ret
  236. oldimer
  237.         jp on_int ;заменится на код из 0x0038
  238.         jp 0x0038+3
  239.  
  240. on_int
  241. ;restore stack with de
  242.         EX DE,HL
  243.         EX (SP),HL ;de="hl", в стеке "de"
  244.         LD (on_int_jp),HL
  245.         LD (on_int_sp),SP
  246.         LD SP,INTSTACK
  247.         push af
  248.         push bc
  249.         push de ;"hl"
  250.         exx
  251.         ex af,af' ;'
  252.         push af
  253.         push bc
  254.         push de
  255.         push hl
  256.         push ix
  257.         push iy
  258.  
  259. curscrnum_int=$+1
  260.         ld e,0
  261.         OS_SETSCREEN
  262.        
  263.         call oldimer ;ei ;а что если выйдем поздно (по yield)? надо в конце обработчика убрать ei, но и это не поможет, т.к. yield сейчас с включенными прерываниями!!!
  264.        
  265.         ;GET_KEY
  266.         ;ld a,c ;кнопка без учёта языка
  267.         ;or a
  268.         ;jr z,$+5
  269.         ;ld (curkey),a
  270.        
  271.         ;OS_GETKEYMATRIX
  272.         LD hl,curwater
  273.         ld a,(hl)
  274.         SUB -16
  275.         LD (hl),A
  276.         CALL MOUSE
  277.         call TIME
  278.         ld hl,timer
  279.         inc (hl)
  280.  
  281.         pop iy
  282.         pop ix
  283.         pop hl
  284.         pop de
  285.         pop bc
  286.         pop af
  287.         ex af,af' ;'
  288.         exx
  289.         pop hl
  290.         pop bc
  291.         pop af        
  292. on_int_sp=$+1
  293.         ld sp,0
  294.         pop de
  295.         ei
  296. on_int_jp=$+1
  297.         jp 0
  298.  
  299.         align 256
  300.        endif
  301. _tables=$
  302.        
  303.        macro TABLE sz
  304.         org _tables
  305. _tables=_tables+sz
  306.        endm
  307.        macro ENDTABLE
  308.        endm
  309.        
  310.         TABLE 0x200
  311. FONT
  312.         INCBIN "w64fnt.bin"   ;todo PG ;todo 256 байт (по 2 символа в байте)
  313.         ENDTABLE
  314.         TABLE 0x200
  315. FONT88
  316.         INCBIN "w88_fnt.bin" ;(пока адрес делится на 512) можно уменьшить (за счёт ненужных символов и высоты), но не сильно
  317.         ENDTABLE
  318.         TABLE 0x100
  319. WATER
  320.         INCBIN "water.bin"    ;todo PG
  321.         ENDTABLE
  322.         TABLE 0x100
  323. DTNTAB ;32 байта по круглому адресу во время построения контура карты
  324. MKMASKBUF EQU DTNTAB ;(MASKWID) ;во время построения карты
  325. TPLACES EQU DTNTAB ;table of y's (per column) usable for worms ;во время построения карты
  326. TXY     EQU TPLACES+256-(2*Nobjects) ;x,y всех червей (генерируется в mkmap) временно, потом используем WORMXY
  327. ;TABSIN  EQU DTNTAB ;пока топорный квадратичный (для перемещения курсора вокруг червя) во время хода игрока (но не логики)
  328. ;MAXWXY EQU 98
  329. ;SPRITE,COORDS,SPEED
  330. WORMXY  EQU DTNTAB ;во время игры
  331. ;TEAM,WORM,ENERGY,WEAPON,AIM,0
  332. CUWORMS EQU DTNTAB+0x80
  333. ;TODO ещё буфер координат партиклов - или их сюда же? тогда не более 22 партиклов при 512 байт на два этих списка
  334.         ENDTABLE
  335.         TABLE 0x100
  336. TITBUF ;todo очередь в PG
  337.         ENDTABLE
  338.         TABLE 0x400
  339. Tshift ;,#400 ;во время игры (скролл 3,5)
  340. grassbuf=Tshift ;for mkmap
  341. grassbufsz=0x400 ;0x200 часто выдаёт "nowhere to worm"
  342. LMNused=grassbuf ;(NLMN) ;for mkmap ;там помечается, какие номера элементов уже использовались
  343. LMNlist=LMNused+256-NLMNONMAP ;список используемых
  344.         ENDTABLE
  345.         TABLE 0x100
  346. TABROLL ;для логики (быстрая работа с маской)
  347.         ENDTABLE
  348.         TABLE 0x200
  349. TMASKLN ;512 ;адреса строк маски = MASK+l*MASKWID ;почему-то не используется при построении карты
  350.         ENDTABLE
  351.        if !ATM
  352.         TABLE 0x200
  353. TMAPLN ;512 ;адреса строк карты = MAP+l*MAPWID ;во время построения карты и для drawinmap (и для FASTMAPPER)
  354.         ENDTABLE
  355.         TABLE 0x200
  356. skysprlist=$+256-(42*6)+(4*6) ;80 строк по 6 байт (480 байт) с запасом сверху на 4 (не хватило на высоту червя) (внутри каждых 6 байт адресация inc l!)
  357.         ENDTABLE
  358.        endif
  359. endtables=_tables
  360.         ds endtables-$
  361. GO
  362.         ld sp,STACK
  363.        if !ATM
  364.         xor a
  365.        out (0xfe),a
  366.         ld hl,0x6000
  367.         ld (hl),a
  368.         inc l
  369.         ld (hl),a
  370.         inc l
  371.         ld (hl),a ;was jp GO
  372.        endif
  373.         LD A,R
  374.         ld l,a
  375.        ;ld hl,0xcdc5;0x4dd5;0xf1b3
  376.         ld (rndseed1),hl
  377.         ld hl,(0x5c78)
  378.        ;ld hl,0x765e;0x2734;0x6c1b
  379.         ld (rndseed2),hl
  380.      
  381.       if !ATM
  382.      ld a,PGLMN
  383.      call OUTME
  384.      ld a,(LMNS)
  385.      ld (LMNSfirstbyte),a
  386.       endif
  387.  
  388.        if ATM
  389. ;шрифт должен содержать по 2 копии каждой буквы
  390.         ld hl,FONT
  391.         ld bc,512 +255 ;+255 для цикла dec bc:inc b:djnz
  392. mkdoublefont0
  393.         ld a,(hl)
  394.         rlca
  395.         rlca
  396.         rlca
  397.         rlca
  398.         or (hl)
  399.         ld (hl),a
  400.         inc hl
  401.         dec bc
  402.         inc b
  403.         djnz mkdoublefont0
  404.        endif
  405.  
  406.         LD HL,TITBUF
  407.         LD (HL),0
  408. ;NACHALO
  409.        if !ATM
  410.         LD DE,MAPDO
  411.         LD BC,MAPWID
  412.         LD L,B;0
  413. MKTBROW0 LD H,TMAPLN/256
  414.         LD (HL),E
  415.         INC H
  416.         LD (HL),D
  417.        ;BIT 6,D
  418.        ;JR NZ,$+6
  419.        ;LD (HL),#C0
  420.        ;DEC H
  421.        ;LD (HL),B
  422.         EX DE,HL
  423.         ADD HL,BC
  424.         EX DE,HL
  425.         INC L
  426.         JR NZ,MKTBROW0
  427.        endif
  428.  
  429.         LD L,0
  430.         LD DE,MASKDO
  431.         LD C,MASKWID
  432. MKTBMSK LD H,TMASKLN/256
  433.         LD (HL),E
  434.         INC H
  435.         LD (HL),D
  436.         LD A,L ;l=y не в маске, а в карте, причём для головы, а не для ног!
  437.        add a,8 ;координата для ног
  438.        cp SKYHGT
  439.        jr nc,MKTBMSKnoblank
  440.        ; CP -8
  441.        ; JR NC,$+6
  442.        ;BIT 5,D
  443.        ;JR NZ,$+7
  444.          LD (HL),BLANK/256
  445.          DEC H
  446.          LD (HL),BLANK&0xff
  447. MKTBMSKnoblank
  448.         RRA
  449.         JR NC,$+5
  450.          EX DE,HL
  451.          ADD HL,BC ;двигаемся каждый второй раз (1 строка маски = 2 строки карты)
  452.          EX DE,HL
  453.         INC L
  454.         JR NZ,MKTBMSK
  455.  
  456.         CALL INIMOUS ;портит ba00
  457.        
  458.        if ATM
  459.         call SetPgMuzC000
  460.         call muz
  461.         ld hl,muz+5
  462.         ld a,(pg1)
  463.         OS_SETMUSIC
  464.        else
  465.         ld a,PGMAP
  466.         call OUTME
  467.         xor a
  468.         ld (muz),a
  469.         ld a,PGLMN
  470.         call OUTME
  471.         ld a,(muz)
  472.         sub 0x21
  473.         ld (muzpatch),a
  474.         call z,muz
  475.          CALL MAKINT
  476.        endif
  477. NACHALO
  478.         LD HL,TLAND
  479.         jr newmapgo
  480. nowhere ;return here if "nowhere to worm"
  481.         LD HL,MESWHE ;"nowhere to worm"
  482. newmapgo
  483.        ld sp,STACK
  484.         CALL MTITLE
  485.         call cls
  486.        
  487.        if ATM
  488.         ;ld de,bgxyfilename
  489.         ;call uvscroll_preparebmp;uvscroll_prepare
  490.         ld de,pal;SUMMERPAL
  491.         OS_SETPAL
  492.         YIELD
  493.         ld hl,panel16
  494.         call DrawPanel
  495.        else
  496.         ld hl,panel
  497.         call DrawPanel
  498.        endif
  499.        
  500.         LD HL,(curdrawingtitle)
  501.         CALL DrawTitle ;печать игрового сообщения
  502.  
  503.         CALL MKMAP
  504.  
  505.        if !ATM
  506.         ld hl,Tshift
  507.         ld de,0x0705
  508.         call fixshift
  509.         ld h,Tshift/256+2
  510.         ld de,0x1f03
  511.         call fixshift
  512.        endif
  513.  
  514. ;TODO сделать нормальный синус
  515. ;он тут кладётся, т.к. TABSIN затёрта во время генерации карты
  516.         ;LD HL,TABSIN
  517.         ;XOR A
  518.         ;LD B,22
  519.         ;LD (HL),A
  520.         ;INC HL
  521.         ;ADD A,B
  522.         ;DJNZ $-3
  523.  
  524.         LD HL,MESHOM
  525.         CALL MTITLE
  526.         CALL DrawAttrField
  527.         CALL ResetTime
  528.         CALL DrawEnergyPanel ;печать панельки для энергии и ветра
  529.  
  530.         LD HL,TABROLL
  531.         LD C,1
  532. MKTRL   LD A,L
  533.         AND 31
  534.         JR NZ,$+4
  535.          RRC C
  536.         LD (HL),C
  537.         INC L
  538.         JR NZ,MKTRL
  539.  
  540.        call ForcedDrawWormsInMap
  541. gamemove
  542.        call DrawWormsDataInMap
  543.        ld a,STATE_MOVE
  544.        ld (gamestate),a
  545. genwind0
  546.         call RND
  547.         and 127
  548.         cp 46+1+46
  549.         jr nc,genwind0
  550.         sub 46
  551.         ld (wind),a
  552.        
  553.        if 1 ;TODO remove
  554. genpowr0
  555.         call RND
  556.         and 127
  557.         cp 119
  558.         jr nc,genwind0
  559.         ld (powr),a
  560.        endif
  561.  
  562.        CALL DrawEnergy ;печать полосок энергии и ветра
  563. gameloop
  564.         LD HL,(MOUSEx)
  565.         LD (MOUSEX),HL
  566.         LD A,(MOUSEy)
  567.         LD (MOUSEY),A
  568.       ;HALT
  569.     ;CALL MAPPER ;печать верха карты при one frame выводилке
  570.        if !ATM
  571.         LD A,PGMAP;16
  572.         CALL OUTME
  573.        endif
  574.     call DrawWormsInMap ;TODO рисовать только сместившихся ;даже если напечатали ниже 0xc000, то всё равно сотрём сразу после отрисовки
  575.        ld a,(gamestate)
  576.        cp STATE_MOVE
  577.        call z,DrawCrossInMap
  578.      CALL DrawMap ;TODO не перерисовывать, если не сменился XY и не сместились объекты (прорисовать только строки под стрелкой для air strike)
  579.      CALL DrawTime
  580.        if !ATM
  581.         LD A,PGMAP;16
  582.         CALL OUTME
  583.        endif
  584.        ld a,(gamestate)
  585.        cp STATE_MOVE
  586.        call z,UnDrawCrossInMap
  587.     call UnDrawWormsInMap ;TODO стирать только сместившихся
  588.     call AnimMines
  589.        ;LD A,-64
  590.        ;LD HY,'TY4TOP
  591.        ;CALL WORMS
  592.        ;CALL CURSOR
  593. oldtitletimer=$+1
  594.         ld e,0
  595.         ld a,(timer)
  596.         ld (oldtitletimer),a
  597.         sub e
  598.         ld e,a
  599. STCNTa=$+1
  600.         LD A,1
  601.         sub e;DEC A
  602.         JR nc,STNOTIT
  603.         xor a
  604. curdrawingtitle=$+1
  605.         LD HL,TITBUF
  606.         CP (HL)
  607.         CALL NZ,DrawTitle ;печать игрового сообщения
  608.         JR $+5
  609. STNOTIT LD (STCNTa),A
  610. ;DOPR    CALL 0 ;печать низа карты при one frame выводилке
  611. ;DOPRA   LD HL,0
  612. ;       LD (HL),#FD
  613. ;       INC HL
  614. ;       INC HL
  615. ;       LD (HL),#E1
  616. ;       CALL DrawWater
  617. ;      LD BC,999
  618. ;      LD D,B
  619. ;NOLDIR LDIR ;wait for turbo mode (недостаточно при 14 МГц)
  620.        ;XOR A
  621.        ;LD HY,'TY4LOW
  622.        ;CALL CURSOR ;TODO для AIRSTRIKE (надо печатать на карте с запоминанием - прямо перед выводом карты, а потом восстанавливать)
  623.  
  624.        if ATM
  625.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  626.         halt
  627.         ;ld a,(curscrnum_int)
  628.         ;ld e,a
  629.         ;OS_SETSCREEN
  630.        endif
  631.  
  632. ;logic:
  633. ;delta timing
  634. oldtimer=$+1
  635.         ld e,0
  636. waithalt
  637.         ld a,(timer)
  638.         ld (oldtimer),a
  639.         sub e
  640.          cp 1;2
  641.        if ATM
  642.         jp c,waithalt ;это не гарантия переключения экрана!!!
  643.        else
  644.         jp c,timeraction0q;waithalt ;чтобы линия обновления экрана была в рандомном месте
  645.        endif
  646. logicframesremained=$+1
  647.        add a,0 ;0..LOGICSPEED-1
  648. timeraction0
  649.         ld (logicframesremained),a
  650.         sub 1;2
  651.         jr c,timeraction0q
  652.         push af
  653.  
  654.        CALL WRMOVE
  655.        ld a,(gamestate)
  656.        cp STATE_MOVE
  657.        call z,ControlCurWorm
  658.        call WormsVsMines
  659.        call StayingWormsVsMovingWorms ;столкновение летящего со стоящим
  660.        
  661.         pop af
  662.         jr timeraction0
  663. timeraction0q
  664.        
  665.        ld a,(gamestate)
  666.        cp STATE_FLYCURWORM
  667.        jr nz,noflycurworm ;не режим прыжка
  668.        call CheckFlyingWorms
  669.        jr nz,noflycurworm ;есть летящие
  670.        call DrawCurWormData
  671.        ld a,STATE_MOVE
  672.        ld (gamestate),a
  673. noflycurworm
  674.        ld a,(gamestate)
  675.        cp STATE_FLY
  676.        jr nz,flyingok ;не режим взрыва
  677.        call CheckFlyingWorms
  678.        jr nz,flyingok ;есть летящие
  679. ;летящих червей больше нет, печатаем названия всех живых червей и переходим в режим смертей (а из него потом или в режим взрыва, или в режим перехода хода)
  680.        ld a,STATE_DIE
  681.        ld (gamestate),a
  682. ;TODO...
  683. ;TODO асинхронно от цикла графики  
  684.         jp gamemove
  685. flyingok
  686. ;
  687.      
  688.        ;CALL CLRTOP
  689.        ;CALL UPPRU
  690.        ;CALL 8020
  691.        ;RET NC
  692.        LD A,-3
  693.        IN A,(-2)
  694.        BIT 1,A
  695.        CALL Z,unsetwms;SETWMS ;"S" - заново расставить червей
  696.        LD A,#FB
  697.        IN A,(-2)
  698.        BIT 3,A
  699.        JP Z,NACHALO ;"R" - заново сгенерировать карту
  700.         JP gameloop
  701.  
  702. timer
  703.         db 0 ;for logic
  704. wind
  705.         db 0 ;-46..46
  706. powr
  707.         db 0 ;0..118
  708. gamestate
  709.         db 0 ;STATE_MOVE=управление червём (в т.ч. ИИ), STATE_SHOT=анимация выстрела, STATE_BULLET=полёт снаряда, STATE_FLY=взрыв, STATE_DIE=смерти, STATE_NEXTMOVE=переход хода
  710. STATE_MOVE=0
  711. STATE_SHOT=1
  712. STATE_BULLET=2
  713. STATE_FLY=3 ;сняты надписи со всех червей
  714. STATE_DIE=4
  715. STATE_NEXTMOVE=5
  716. STATE_FLYCURWORM=6 ;прыжок/падение во время хода, снята надпись только с текущего червя
  717.  
  718.        if !ATM
  719. fixshift
  720. fixshift0
  721.         ld b,e
  722.         ld a,l
  723.         RRCA
  724.         DJNZ $-1
  725.         ld (hl),a
  726.         and d
  727.         inc h
  728.         ld (hl),a
  729.         dec h
  730.         xor (hl)
  731.         ld (hl),a
  732.         inc l
  733.         jr nz,fixshift0
  734.         ret
  735.        endif
  736.  
  737.        if !ATM
  738. MAKINT
  739.         LD A,IMTAB/256
  740.         LD I,A
  741.         IM 2
  742.         EI
  743.         RET
  744.        endif
  745.  
  746.       if !ATM
  747. ;PRGA    LD A,0
  748. curpg
  749.         db 0x10
  750. OUTME
  751.         ;LD (PRGA+1),A
  752.         ld (curpg),a
  753. ;OUTNO
  754.         PUSH BC
  755.         LD BC,FD
  756.         OUT (C),A
  757.         POP BC
  758.         RET
  759.       endif
  760.  
  761. SetPgMask
  762.        if ATM
  763. pgmask=$+1
  764.         ld a,0
  765.         push bc
  766.         SETPGC000
  767.         pop bc
  768.         ret
  769.        else
  770.        LD A,PGMASK_
  771.        jp OUTME
  772.        endif
  773.  
  774.        if ATM
  775. SetPgMask8000
  776.         ld a,(pgmask)
  777.         push bc
  778.         SETPG8000
  779.         pop bc
  780.        ret
  781. SetPgTexture8000
  782. pg1=$+1
  783.         ld a,0
  784.         push bc
  785.         SETPG8000
  786.         pop bc
  787.        ret
  788. SetPgTextureC000
  789.         ld a,(pg1)
  790.         push bc
  791.         SETPGC000
  792.         pop bc
  793.        ret
  794. SetPgLmn8000
  795. pg2=$+1
  796.         ld a,0
  797.         push bc
  798.         SETPG8000
  799.         pop bc
  800.        ret
  801. SetPgMuzC000
  802.         ld a,(pg2) ;TODO отдельная страница
  803.         push bc
  804.         SETPGC000
  805.         pop bc
  806.        ret
  807.        endif
  808.  
  809. RND
  810.         PUSH de
  811.         PUSH HL
  812. ;Patrik Rak
  813. rndseed1=$+1
  814.         ld  hl,0xA280   ; xz -> yw
  815. rndseed2=$+1
  816.         ld  de,0xC0DE   ; yw -> zt
  817.         ld  (rndseed1),de  ; x = y, z = w
  818.         ld  a,e         ; w = w ^ ( w << 3 )
  819.         add a,a
  820.         add a,a
  821.         add a,a
  822.         xor e
  823.         ld  e,a
  824.         ld  a,h         ; t = x ^ (x << 1)
  825.         add a,a
  826.         xor h
  827.         ld  d,a
  828.         rra             ; t = t ^ (t >> 1) ^ w
  829.         xor d
  830.         xor e
  831.         ld  h,l         ; y = z
  832.         ld  l,a         ; w = t
  833.         ld  (rndseed2),hl
  834.         POP HL
  835.         POP de
  836.         RET
  837.  
  838. RNDA
  839.         PUSH BC
  840.         LD C,A
  841.         CALL RND
  842.         SUB C
  843.         JR NC,$-1
  844.         ADD A,C
  845.         POP BC
  846.         RET
  847.  
  848. unsetwms
  849.        ld a,(gamestate)
  850.        cp STATE_FLY
  851.        ret z
  852.        call ForcedUnDrawWormsInMap
  853.        call UnDrawWormsDataInMap
  854.        ld a,STATE_FLY
  855.        ld (gamestate),a
  856.  
  857.         ld a,80
  858.         call RND
  859.        add a,80
  860.         ld e,a ;y0
  861.         call RND
  862.         ld c,a ;x0low
  863.         xor a
  864.         sla c
  865.         rla
  866.         sla c
  867.         rla
  868.         ld b,a ;bc=x0
  869.         ld a,40
  870.         call RNDA
  871.         add a,10
  872.         ld d,a ;d=R
  873.          ;ld bc,200
  874.          ;ld e,100
  875.         call UnDrawCircleInMap
  876.  
  877.         LD HL,WORMXY
  878. unsetwms0
  879.         ;POP BC ;SPRITE (lsb=xlow*32)
  880.         ;POP HL ;COORDS
  881.         ;POP DE ;SPEED
  882.         ld c,(hl)
  883.         inc l
  884.         ld b,(hl) ;spritehsb
  885.         inc l
  886.         dec b
  887.         ret z
  888.         inc b
  889.         ld a,(hl) ;x
  890.         inc l
  891.         inc l
  892.         inc l
  893.        cp XWID
  894.        jr nc,unsetwms_skip
  895.         call RND
  896.         and 7
  897.         sub 4
  898.         ld c,a
  899.         call RND
  900.         and 7
  901.         sub 7;4
  902.         ld b,a ;dy
  903.         dec l
  904.         ld (hl),c
  905.         inc l
  906.         ld (hl),b
  907. unsetwms_skip
  908.         inc l
  909.         jr unsetwms0
  910.  
  911. SETWMS
  912. ;чтобы считывать XY в случайном порядке, будем переставлять случайно несколько раз с первым
  913.         ld b,100
  914. SETWMS_SHUFFLE0
  915.         ld hl,TXY
  916.         xor a
  917.         sub l
  918.         srl a ;число объектов
  919.         call RNDA
  920.         add a,a
  921.         cpl
  922.         ld e,a
  923.         dec e
  924.         ld d,h
  925.         ld c,(hl)
  926.         ld a,(de)
  927.         ld (hl),a
  928.         ld a,c
  929.         ld (de),a
  930.         inc l
  931.         inc e
  932.         ld c,(hl)
  933.         ld a,(de)
  934.         ld (hl),a
  935.         ld a,c
  936.         ld (de),a
  937.         djnz SETWMS_SHUFFLE0
  938.  
  939.         LD HL,WORMXY
  940.         LD DE,TXY
  941.         LD B,0
  942. SWMS0   LD A,(DE) ;x from TXY (до 186?)
  943.        ;ld a,l
  944.         INC E
  945.         LD C,A
  946. ;SWMSAp1=$+1
  947.         LD A,#80
  948.         ;SRL C
  949.         ;RRA
  950.         LD (HL),A ;xlow*64;32 (was for sprite)
  951.         INC HL
  952.         LD (HL),sprworm_0/256;BOMBWMS/256+1 ;sprite
  953.        ld a,e
  954.        cp -2*4 ;4 mines (last in the list)
  955.        jr c,$+4
  956.        LD (HL),sprmine_0/256;BOMBWMS/256+1 ;sprite
  957.         INC HL
  958.         LD (HL),C ;xhigh
  959.         INC HL
  960.         LD A,(DE) ;y from TXY
  961.        ;ld a,l
  962.         LD (HL),A ;y
  963.         INC HL
  964.         LD (HL),B;0 ;dx
  965.         INC HL
  966.         LD (HL),SPRLIST_STAYING ;dy
  967.         INC HL
  968.         INC E
  969.         JR NZ,SWMS0
  970.         INC HL
  971.         LD (HL),1 ;end of list (impossible xlow)
  972.        inc hl
  973.        inc hl
  974.        inc hl
  975.        inc hl
  976.        ld (hl),SPRLIST_END ;end of list (impossible dy)
  977.         ;LD HL,SWMSAp1
  978.         ;LD A,(HL)
  979.         ;SUB -2
  980.         ;OR #80
  981.         ;LD (HL),A ;"рандомная" младшая часть x
  982.         LD HL,CUWORMS
  983. MKCUW0  XOR A
  984. MKCUW1  LD (HL),B ;team 0..3
  985.         INC HL
  986.         LD (HL),A ;worm 0..3 in team
  987.         INC HL
  988.         LD (HL),150 ;health
  989.         INC HL
  990.         LD (HL),0 ;???
  991.         INC HL
  992.         LD (HL),10 ;???
  993.         INC HL
  994.         INC HL
  995.         INC A ;next worm in team
  996.         CP 4
  997.         JR C,MKCUW1
  998.         INC B
  999.        ld a,b
  1000.        cp 4 ;костыль ;FIXME for 2 or 3 teams
  1001.         ;CP B ;4 teams ;FIXME for 2 or 3 teams
  1002.         JR NZ,MKCUW0
  1003.         RET
  1004.  
  1005. ;offint:
  1006. MOUSEX  DW 0
  1007. MOUSEY  DB 0
  1008.  
  1009. NUMFONTCHARSZ=16;8
  1010.  
  1011. ResetTime
  1012.         LD HL,6*NUMFONTCHARSZ*256+(0*NUMFONTCHARSZ) ;"60"
  1013.         LD (curtime),HL
  1014.         LD A,50
  1015.         LD (curtimeframe),A
  1016.         jp Hud_ResetTime
  1017.  
  1018. TIME
  1019. curtime=$+1
  1020.         LD BC,6*NUMFONTCHARSZ*256+(0*NUMFONTCHARSZ) ;"60"
  1021.         LD A,C
  1022.         INC A
  1023.         ret z ;JR Z,PTIMOUT
  1024. curtimeframe=$+1
  1025.         LD A,50
  1026.         DEC A
  1027.         JR NZ,$+4
  1028.         LD A,50
  1029.         LD (curtimeframe),A
  1030.         ret nz ;JR NZ,TIMPR
  1031.         LD A,C
  1032.         SUB NUMFONTCHARSZ;8
  1033.         LD C,A
  1034.         JR NC,TIMEok
  1035.         LD C,9*NUMFONTCHARSZ;8
  1036.         LD A,B
  1037.         SUB NUMFONTCHARSZ;8
  1038.         LD B,A
  1039.         JR NC,TIMEok
  1040.         LD HL,MESTIM
  1041.         CALL MTITLE
  1042.         LD A,-1
  1043.         LD (curtime),A
  1044.         jp Hud_UnDrawTime
  1045. TIMEok  LD (curtime),BC
  1046.         ret
  1047.  
  1048.  
  1049.  
  1050.        if FASTMAPPER
  1051. MAKELDI
  1052.         PUSH BC
  1053.         LD (HL),225
  1054.         INC HL
  1055.         LD B,15
  1056. MLDI1   LD (HL),225
  1057.         INC HL
  1058.         LD (HL),34
  1059.         INC HL
  1060.         LD (HL),E
  1061.         INC HL
  1062.         LD (HL),D
  1063.         INC HL
  1064.         INC E
  1065.         INC E
  1066.         DJNZ MLDI1
  1067.         CALL DDE
  1068.         POP BC
  1069.         DJNZ MAKELDI
  1070.         DEC HL
  1071.         DEC HL
  1072.         CALL READER
  1073.         LD SP,IX
  1074.         RET
  1075.         NOP
  1076.         RET
  1077.        endif
  1078.  
  1079.        if FASTMAPPER
  1080. READER
  1081. ;генерация в HL куска кода, заданного после CALL (0 = конец куска)
  1082.         EX DE,HL
  1083.         EX (SP),HL
  1084.         DEC DE
  1085. READ0   INC DE
  1086.         LD A,(HL)
  1087.         LD (DE),A
  1088.         INC HL
  1089.         OR A
  1090.         JR NZ,READ0
  1091.         EX (SP),HL
  1092.         EX DE,HL
  1093.         RET
  1094.        endif
  1095.  
  1096. cursorkeys
  1097.         db 0 ;11LRDUef cursor
  1098.  
  1099. TLAND   DB 18,"CREATING LANDSCAPE"
  1100. MESHOM  DB 17,"2X HOMING MISSILE"
  1101. MESWHE  DB 16,"NOWHERE TO WORM!"
  1102. MESTIM  DB 11,"TIME IS OUT"
  1103.         db 0
  1104. MESDIE  DB "123456789012 IS AN EX-WORM"
  1105. MESTEAM
  1106.         DB "1234567890123456 TEAM IS NO MORE"
  1107. TEAMLEN=16
  1108. CUTEAMS ;каждая надпись по TEAMLEN символов
  1109.         DB "ALONE CODER     "
  1110.         DB "DAVE            "
  1111.         DB "WORMS           "
  1112.         DB "THE FARM        "
  1113.  
  1114. NAMES   DB "ALCO        "
  1115.         DB "ALCO2       "
  1116.         DB "ALCO3       "
  1117.         DB "ALCO4       "
  1118.         DB "DAVE        "
  1119.         DB "D2          "
  1120.         DB "D3          "
  1121.         DB "D4          "
  1122.         DB "FLAT        "
  1123.         DB "EARTH       "
  1124.         DB "TAPE        "
  1125.         DB "WOOD        "
  1126.         DB "MOO         "
  1127.         DB "HORSE       "
  1128.         DB "PIGGY       "
  1129.         DB "CHICKEN     "
  1130.        ;db "BOMBA       "
  1131.        ;db "BOMBA       "
  1132.        ;db "BOMBA       "
  1133.        ;db "BOMBA       "
  1134.  
  1135. numfont
  1136.         include "numfont.ast"
  1137.        
  1138.        if !ATM
  1139.         include "panel.ast" ;в 48K версии можно несъёмную панель (без панелей оружия)
  1140.        endif
  1141.  
  1142.         include "input.asm"
  1143.         include "mkmap.asm"
  1144.        if ATM
  1145.         include "mkmapatm.asm"
  1146.        else
  1147.         include "mkmap6912.asm"
  1148.        endif
  1149.         include "hud.asm"
  1150.        if ATM
  1151.         include "hudatm.asm"
  1152.        else
  1153.         include "hud6912.asm"
  1154.        endif
  1155.        display "fast procedures: ",$,">=0x8000"
  1156.         include "logic.asm"
  1157.         include "drawmap.asm"
  1158.        if ATM
  1159.         include "drawmapatm.asm"
  1160.         include "bgpushxy.asm"
  1161.         include "../../_sdk/file.asm"
  1162.         ;include "../../_sdk/bmp.asm"
  1163. ;bmpwid
  1164.         ;dw 0
  1165.         include "mem.asm"
  1166.        else
  1167.         include "drawmap6912.asm"
  1168.        endif
  1169.         include "drawinmap.asm"
  1170.        if ATM
  1171.         include "drawinmapatm.asm"
  1172.        else
  1173.         include "drawinmap6912.asm"
  1174.        endif
  1175.  
  1176.        if ATM
  1177. BLANK   DS MASKWID ;BLANK - пустая строка маски (небо) шириной MASKWID
  1178.        else
  1179.         align 256
  1180. IMTAB   DS 257,$/256+1
  1181. BLANK   DS $/256-1 ;BLANK - пустая строка маски (небо) шириной MASKWID
  1182. IMER
  1183. ;restore stack from de
  1184. ;if sp=screen, fill with 0
  1185. ;if critical section, unwind de/bc and restore from de/bc
  1186.         ld (imerhl),hl
  1187.         pop hl
  1188.         ld (imerjp),hl
  1189.         ld (imersp),sp
  1190.         ld sp,INTSTACK
  1191.        push BC
  1192.        push DE
  1193.        push HL
  1194.        PUSH AF
  1195.       if !ATM
  1196.         ld a,l
  1197.         sub x6line_startcritical&0xff
  1198.         ld a,h
  1199.         sbc a,x6line_startcritical/256
  1200.         jr c,IMERnocritical
  1201.         ld a,l
  1202.         sub x6line_endcritical&0xff
  1203.         ld a,h
  1204.         sbc a,x6line_endcritical/256
  1205.         jr nc,IMERnocritical
  1206.         ld a,(x6line_restorede_startcritical+x6line_startcritical)&0xff
  1207.         sub l
  1208.         ld l,a
  1209.         ld a,((x6line_restorede_startcritical+x6line_startcritical)/256)&0xff
  1210.         sbc a,h
  1211.         ld h,a
  1212.        pop af
  1213.        push af
  1214.        ld (IMERcriticaljp),hl
  1215.        ld hl,IMERcritical_restorede ;jp (hl)=restore de, ret=restore bc
  1216. IMERcriticaljp=$+1
  1217.        call 0 ;unwind de ;addr=x6line_restorede_startcritical-(imerjp-x6line_startcritical)
  1218.         ld hl,(imersp)
  1219.         dec hl
  1220.         ld (hl),b
  1221.         dec hl
  1222.         ld (hl),c
  1223.        jp IMERcriticalq
  1224. IMERcritical_restorede
  1225. ;after jp (hl)
  1226.        pop af ;skip return addr
  1227. IMERnocritical
  1228.       endif
  1229.         ld hl,(imersp)
  1230.        dec hl
  1231.        dec hl
  1232.         bit 7,h
  1233.         jr nz,IMERnozerostack
  1234.         ld de,0
  1235.       if !ATM
  1236.        ld a,l
  1237.        inc a
  1238.        jr nz,IMERnozerostack
  1239.        ld a,h
  1240.        sub 0x50
  1241.        cp 7
  1242.        jr nc,IMERnozerostack
  1243. ;при запарывании 0x50ff..0x56ff (ATM=0)
  1244. ;50ff - берём из 51ff
  1245. ;51ff - берём из 50ff
  1246. ;52ff - берём из 51ff
  1247. ;53ff - берём 0f
  1248. ;прочие - берём ff
  1249.         ;call ReDrawEnergy ;при запарывании 0x50ff..0x56ff
  1250.         cp 3
  1251.         ld e,0x0f
  1252.         jr z,IMERnozerostack
  1253.         ld e,0xff
  1254.         jr nc,IMERnozerostack
  1255.         cpl
  1256.         and 1
  1257.         add a,0x50
  1258.         ld b,a
  1259.         ld c,l
  1260.         ld a,(bc)
  1261.         ld e,a
  1262.       endif
  1263. IMERnozerostack
  1264.         ld (hl),e
  1265.         inc hl
  1266.         ld (hl),d
  1267. IMERcriticalq
  1268.         LD hl,curwater
  1269.         ld a,(hl)
  1270.         SUB -16
  1271.         LD (hl),A
  1272.        ex af,af' ;'
  1273.        PUSH AF
  1274.         CALL MOUSE
  1275.         call TIME
  1276.         ld hl,timer
  1277.         inc (hl)
  1278.         ld a,(curpg)
  1279.         push af
  1280.         push ix
  1281.         push iy
  1282.         ld a,PGLMN
  1283.         call OUTME
  1284. muzpatch=$+1
  1285.         ld a,0
  1286.         or a
  1287.         call z,muz+5
  1288.         pop iy
  1289.         pop ix
  1290.         pop af
  1291.         call OUTME
  1292.        pop AF
  1293.        ex af,af' ;'
  1294.        pop AF
  1295.        POP HL
  1296.        pop DE
  1297.        pop BC
  1298. imersp=$+1
  1299.         ld sp,0
  1300. imerhl=$+1
  1301.         ld hl,0
  1302.         EI
  1303. imerjp=$+1
  1304.         jp 0
  1305.        endif
  1306.  
  1307.        if ATM
  1308. genpush_newpage
  1309. ;заказывает страницу, заносит в tpushpgs, a=pg
  1310.         push bc
  1311.         push de
  1312.         push hl
  1313.         push ix
  1314.         OS_NEWPAGE
  1315.         pop ix
  1316.         ld a,e
  1317.         ld (ix),a
  1318.         ld de,4
  1319.         add ix,de
  1320.         pop hl
  1321.         pop de
  1322.         pop bc
  1323.         ret
  1324.  
  1325. RestoreMemMap3
  1326.         ;ld a,CC_PAGE3;0
  1327.         ;jp setpgc000;SETPG32KHIGH
  1328.         ret
  1329.  
  1330.         include "grass16.ast"
  1331. ;pal
  1332. ;DDp palette: %grbG11RB(low),%grbG11RB(high), инверсные
  1333.         ;STANDARDPAL
  1334.         include "pal.ast"
  1335. res_path
  1336. ;в этом относительном пути будут лежать все загружаемые данные игры
  1337.         db "worms"
  1338.         db 0
  1339. fnpg1
  1340.         db "hicode.c",0
  1341. fnpg2
  1342.         db "hicode2.c",0
  1343.        
  1344.         align 256 ;for setpixel
  1345. tpushpgs
  1346.         ds 128 ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
  1347.  
  1348.         align 256
  1349. trecodebyteleft
  1350.         dup 256
  1351. ;%00003210 => %.3...210
  1352. _3=$&8
  1353. _210=$&7
  1354.         db (_3*0x08) + (_210*0x01)
  1355.         edup
  1356.        
  1357. trecodebyteright
  1358.         dup 256
  1359. ;%00003210 => %3.210...
  1360. _3=$&8
  1361. _210=$&7
  1362.         db (_3*0x10) + (_210*0x08)
  1363.         edup
  1364.  
  1365. bgpush_bmpbuf ds 1024;320 ;заголовок bmp или одна строка
  1366.        endif
  1367.  
  1368.         display "endcode=",$
  1369.  
  1370.         align 256
  1371. tsin
  1372.         incbin "sin"
  1373.        if !ATM
  1374.         align 256
  1375.         include "texture.ast" ;только при генерации карты (0x800 байт) (можно урезать (как на Амиге) или сжать?)
  1376.        endif
  1377.         align 256
  1378.         include "sprites.ast"
  1379. sprpie
  1380.         INCBIN "gug.bin" ;только при генерации карты (на 48K можно убрать)
  1381.        
  1382.         display "endgfx=",$
  1383. endall
  1384.  
  1385.        if !ATM
  1386.         ORG 0x6000
  1387.         jp GO
  1388.        endif
  1389.  
  1390.         page PGHICODE
  1391.         ORG 0xc000
  1392. hicode_begin
  1393.        if !ATM
  1394.         nop ;TODO в этой странице тоже что-нибудь
  1395.        else
  1396.         include "texforrest.ast"
  1397.         include "panel16.ast"
  1398.        endif
  1399. hicode_end
  1400.  
  1401.         page PGLMN
  1402.         ORG 0xc000
  1403. hicode2_begin
  1404. LMNS
  1405.         INCBIN "lmn.bin" ;>7K! в формате SCUT
  1406. muz
  1407.         include "../../_sdk/ptsplay.asm"
  1408. MDLADDR
  1409.         incbin "music/WORMS8.pt3"        
  1410. ;GUG
  1411. ;        INCBIN "gug.bin" ;только при генерации карты (на 48K можно убрать)
  1412. hicode2_end
  1413.  
  1414.        if !ATM
  1415.         page 0
  1416.         savebin "code.c",begin,endall-begin
  1417.         page PGHICODE;6
  1418.         savebin "hicode.c",hicode_begin,hicode_end-hicode_begin
  1419.         page PGLMN;4
  1420.         savebin "hicode2.c",hicode2_begin,hicode2_end-hicode2_begin
  1421.        else
  1422.         page 0
  1423.         savebin "worms.com",begin,endall-begin
  1424.         page PGHICODE;6
  1425.         savebin "worms/hicode.c",hicode_begin,hicode_end-hicode_begin
  1426.         page PGLMN;4
  1427.         savebin "worms/hicode2.c",hicode2_begin,hicode2_end-hicode2_begin
  1428.        endif
  1429.  
  1430.         LABELSLIST "../../../us/user.l",1
  1431.