?login_element?

Subversion Repositories NedoOS

Rev

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