?login_element?

Subversion Repositories NedoOS

Rev

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

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