Subversion Repositories NedoOS

Rev

Rev 1507 | Rev 1545 | 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.        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. ;       if ATM
  299. ;_tables=0x0200
  300. ;       else
  301. ;_tables=0x6000
  302. ;       endif
  303.        
  304.        macro TABLE sz
  305.         org _tables
  306. _tables=_tables+sz
  307.        endm
  308.        macro ENDTABLE
  309.        endm
  310.        
  311.         TABLE 0x200
  312. FONT
  313.         INCBIN "w64fnt.bin"   ;todo PG ;todo 256 байт (по 2 символа в байте)
  314.         ENDTABLE
  315.         TABLE 0x200
  316. FONT88
  317.         INCBIN "w88_fnt.bin" ;(пока адрес делится на 512) можно уменьшить (за счёт ненужных символов и высоты), но не сильно
  318.         ENDTABLE
  319.         TABLE 0x100
  320. WATER
  321.         INCBIN "water.bin"    ;todo PG
  322.         ENDTABLE
  323.         TABLE 0x100
  324. DTNTAB ;32 байта по круглому адресу во время построения контура карты
  325. MKMASKBUF EQU DTNTAB ;(MASKWID) ;во время построения карты
  326. TPLACES EQU DTNTAB ;table of y's (per column) usable for worms ;во время построения карты
  327. TXY     EQU TPLACES+256-(2*Nobjects) ;x,y всех червей (генерируется в mkmap) временно, потом используем WORMXY
  328. ;TABSIN  EQU DTNTAB ;пока топорный квадратичный (для перемещения курсора вокруг червя) во время хода игрока (но не логики)
  329. ;MAXWXY EQU 98
  330. ;SPRITE,COORDS,SPEED
  331. WORMXY  EQU DTNTAB ;во время игры
  332. ;TEAM,WORM,ENERGY,WEAPON,AIM,0
  333. CUWORMS EQU DTNTAB+0x80
  334. ;TODO ещё буфер координат партиклов - или их сюда же? тогда не более 22 партиклов при 512 байт на два этих списка
  335.         ENDTABLE
  336.         TABLE 0x100
  337. TITBUF ;todo очередь в PG
  338.         ENDTABLE
  339.         TABLE 0x400
  340. Tshift ;,#400 ;во время игры (скролл 3,5)
  341. grassbuf=Tshift ;for mkmap
  342. grassbufsz=0x400 ;0x200 часто выдаёт "nowhere to worm"
  343. LMNused=grassbuf ;(NLMN) ;for mkmap ;там помечается, какие номера элементов уже использовались
  344. LMNlist=LMNused+256-NLMNONMAP ;список используемых
  345.         ENDTABLE
  346.         TABLE 0x100
  347. TABROLL ;для логики (быстрая работа с маской)
  348.         ENDTABLE
  349.         TABLE 0x200
  350. TMASKLN ;512 ;адреса строк маски = MASK+l*MASKWID ;почему-то не используется при построении карты
  351.         ENDTABLE
  352.        if !ATM
  353.         TABLE 0x200
  354. TMAPLN ;512 ;адреса строк карты = MAP+l*MAPWID ;во время построения карты и для drawinmap (и для FASTMAPPER)
  355.         ENDTABLE
  356.         TABLE 0x200
  357. skysprlist=$+256-(42*6)+(4*6) ;80 строк по 6 байт (480 байт) с запасом сверху на 4 (не хватило на высоту червя) (внутри каждых 6 байт адресация inc l!)
  358.         ENDTABLE
  359.        endif
  360. endtables=_tables
  361.         ds endtables-$
  362. GO
  363.         ld sp,STACK
  364.        if !ATM
  365.         xor a
  366.        out (0xfe),a
  367.         ld hl,0x6000
  368.         ld (hl),a
  369.         inc l
  370.         ld (hl),a
  371.         inc l
  372.         ld (hl),a ;was jp GO
  373.        endif
  374.         LD A,R
  375.         ld l,a
  376.        ;ld hl,0xcdc5;0x4dd5;0xf1b3
  377.         ld (rndseed1),hl
  378.         ld hl,(0x5c78)
  379.        ;ld hl,0x765e;0x2734;0x6c1b
  380.         ld (rndseed2),hl
  381.      
  382.       if !ATM
  383.      ld a,PGLMN
  384.      call OUTME
  385.      ld a,(LMNS)
  386.      ld (LMNSfirstbyte),a
  387.       endif
  388.  
  389.        if ATM
  390. ;шрифт должен содержать по 2 копии каждой буквы
  391.         ld hl,FONT
  392.         ld bc,512 +255 ;+255 для цикла dec bc:inc b:djnz
  393. mkdoublefont0
  394.         ld a,(hl)
  395.         rlca
  396.         rlca
  397.         rlca
  398.         rlca
  399.         or (hl)
  400.         ld (hl),a
  401.         inc hl
  402.         dec bc
  403.         inc b
  404.         djnz mkdoublefont0
  405.        endif
  406.  
  407.         LD HL,TITBUF
  408.         LD (HL),0
  409. ;NACHALO
  410.        if !ATM
  411.         LD DE,MAPDO
  412.         LD BC,MAPWID
  413.         LD L,B;0
  414. MKTBROW0 LD H,TMAPLN/256
  415.         LD (HL),E
  416.         INC H
  417.         LD (HL),D
  418.        ;BIT 6,D
  419.        ;JR NZ,$+6
  420.        ;LD (HL),#C0
  421.        ;DEC H
  422.        ;LD (HL),B
  423.         EX DE,HL
  424.         ADD HL,BC
  425.         EX DE,HL
  426.         INC L
  427.         JR NZ,MKTBROW0
  428.        endif
  429.  
  430.         LD L,0
  431.         LD DE,MASKDO
  432.         LD C,MASKWID
  433. MKTBMSK LD H,TMASKLN/256
  434.         LD (HL),E
  435.         INC H
  436.         LD (HL),D
  437.         LD A,L ;l=y не в маске, а в карте, причём для головы, а не для ног!
  438.        add a,8 ;координата для ног
  439.        cp SKYHGT
  440.        jr nc,MKTBMSKnoblank
  441.        ; CP -8
  442.        ; JR NC,$+6
  443.        ;BIT 5,D
  444.        ;JR NZ,$+7
  445.          LD (HL),BLANK/256
  446.          DEC H
  447.          LD (HL),BLANK&0xff
  448. MKTBMSKnoblank
  449.         RRA
  450.         JR NC,$+5
  451.          EX DE,HL
  452.          ADD HL,BC ;двигаемся каждый второй раз (1 строка маски = 2 строки карты)
  453.          EX DE,HL
  454.         INC L
  455.         JR NZ,MKTBMSK
  456.  
  457.         CALL INIMOUS ;портит ba00
  458.        
  459.        if ATM
  460.         call SetPgMuzC000
  461.         call muz
  462.         ld hl,muz+5
  463.         ld a,(pg1)
  464.         OS_SETMUSIC
  465.        else
  466.         ld a,PGMAP
  467.         call OUTME
  468.         xor a
  469.         ld (muz),a
  470.         ld a,PGLMN
  471.         call OUTME
  472.         ld a,(muz)
  473.         sub 0x21
  474.         ld (muzpatch),a
  475.         call z,muz
  476.          CALL MAKINT
  477.        endif
  478. NACHALO
  479.         LD HL,TLAND
  480.         jr newmapgo
  481. nowhere ;return here if "nowhere to worm"
  482.         LD HL,MESWHE ;"nowhere to worm"
  483. newmapgo
  484.        ld sp,STACK
  485.         CALL MTITLE
  486.         call cls
  487.        
  488.        if ATM
  489.         ;ld de,bgxyfilename
  490.         ;call uvscroll_preparebmp;uvscroll_prepare
  491.         ld de,pal;SUMMERPAL
  492.         OS_SETPAL
  493.         YIELD
  494.         ld hl,panel16
  495.         call DrawPanel
  496.        else
  497.         ld hl,panel
  498.         call DrawPanel
  499.        endif
  500.        
  501.         LD HL,(curdrawingtitle)
  502.         CALL DrawTitle ;печать игрового сообщения
  503.  
  504.         CALL MKMAP
  505.  
  506.        if !ATM
  507.         ld hl,Tshift
  508.         ld de,0x0705
  509.         call fixshift
  510.         ld h,Tshift/256+2
  511.         ld de,0x1f03
  512.         call fixshift
  513.        endif
  514.  
  515. ;TODO сделать нормальный синус
  516. ;он тут кладётся, т.к. TABSIN затёрта во время генерации карты
  517.         ;LD HL,TABSIN
  518.         ;XOR A
  519.         ;LD B,22
  520.         ;LD (HL),A
  521.         ;INC HL
  522.         ;ADD A,B
  523.         ;DJNZ $-3
  524.  
  525.         LD HL,MESHOM
  526.         CALL MTITLE
  527.         CALL DrawAttrField
  528.         CALL ResetTime
  529.         CALL DrawEnergyPanel ;печать панельки для энергии и ветра
  530.  
  531.         LD HL,TABROLL
  532.         LD C,1
  533. MKTRL   LD A,L
  534.         AND 31
  535.         JR NZ,$+4
  536.          RRC C
  537.         LD (HL),C
  538.         INC L
  539.         JR NZ,MKTRL
  540.  
  541.        call ForcedDrawWormsInMap
  542. gamemove
  543.        call DrawWormsDataInMap
  544.        ld a,STATE_MOVE
  545.        ld (gamestate),a
  546. genwind0
  547.         call RND
  548.         and 127
  549.         cp 46+1+46
  550.         jr nc,genwind0
  551.         sub 46
  552.         ld (wind),a
  553.        
  554.        if 1 ;TODO remove
  555. genpowr0
  556.         call RND
  557.         and 127
  558.         cp 119
  559.         jr nc,genwind0
  560.         ld (powr),a
  561.        endif
  562.  
  563.        CALL DrawEnergy ;печать полосок энергии и ветра
  564. gameloop
  565.         LD HL,(MOUSEx)
  566.         LD (MOUSEX),HL
  567.         LD A,(MOUSEy)
  568.         LD (MOUSEY),A
  569.       ;HALT
  570.     ;CALL MAPPER ;печать верха карты при one frame выводилке
  571.        if !ATM
  572.         LD A,PGMAP;16
  573.         CALL OUTME
  574.        endif
  575.     call DrawWormsInMap ;TODO рисовать только сместившихся ;даже если напечатали ниже 0xc000, то всё равно сотрём сразу после отрисовки
  576.      CALL DrawMap ;TODO не перерисовывать, если не сменился XY и не сместились объекты (прорисовать только строки под стрелкой для air strike)
  577.      CALL DrawTime
  578.        if !ATM
  579.         LD A,PGMAP;16
  580.         CALL OUTME
  581.        endif
  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.      if 1;!ATM ;TODO!!!
  650.        CALL WRMOVE
  651.      endif
  652.        call ControlCurWorm
  653.        call WormsVsMines
  654.        call StayingWormsVsMovingWorms ;столкновение летящего со стоящим
  655.        
  656.         pop af
  657.         jr timeraction0
  658. timeraction0q
  659.        
  660.        ld a,(gamestate)
  661.        cp STATE_FLY
  662.        jr nz,flyingok ;не режим взрыва
  663.        call CheckFlyingWorms
  664.        jr nz,flyingok ;есть летящие
  665. ;летящих червей больше нет, печатаем названия всех живых червей и переходим в режим смертей (а из него потом или в режим взрыва, или в режим перехода хода)
  666.        ld a,STATE_DIE
  667.        ld (gamestate),a
  668. ;TODO...
  669. ;TODO асинхронно от цикла графики  
  670.         jp gamemove
  671. flyingok
  672. ;
  673.      
  674.        ;CALL CLRTOP
  675.        ;CALL UPPRU
  676.        ;CALL 8020
  677.        ;RET NC
  678.        LD A,-3
  679.        IN A,(-2)
  680.        BIT 1,A
  681.        CALL Z,unsetwms;SETWMS ;"S" - заново расставить червей
  682.        LD A,#FB
  683.        IN A,(-2)
  684.        BIT 3,A
  685.        JP Z,NACHALO ;"R" - заново сгенерировать карту
  686.         JP gameloop
  687.  
  688. timer
  689.         db 0 ;for logic
  690. wind
  691.         db 0 ;-46..46
  692. powr
  693.         db 0 ;0..118
  694. gamestate
  695.         db 0 ;STATE_MOVE=управление червём (в т.ч. ИИ), STATE_SHOT=анимация выстрела, STATE_BULLET=полёт снаряда, STATE_FLY=взрыв, STATE_DIE=смерти, STATE_NEXTMOVE=переход хода
  696. STATE_MOVE=0
  697. STATE_SHOT=1
  698. STATE_BULLET=2
  699. STATE_FLY=3
  700. STATE_DIE=4
  701. STATE_NEXTMOVE=5
  702.  
  703.        if !ATM
  704. fixshift
  705. fixshift0
  706.         ld b,e
  707.         ld a,l
  708.         RRCA
  709.         DJNZ $-1
  710.         ld (hl),a
  711.         and d
  712.         inc h
  713.         ld (hl),a
  714.         dec h
  715.         xor (hl)
  716.         ld (hl),a
  717.         inc l
  718.         jr nz,fixshift0
  719.         ret
  720.        endif
  721.  
  722.        if !ATM
  723. MAKINT
  724.         LD A,IMTAB/256
  725.         LD I,A
  726.         IM 2
  727.         EI
  728.         RET
  729.        endif
  730.  
  731.       if !ATM
  732. ;PRGA    LD A,0
  733. curpg
  734.         db 0x10
  735. OUTME
  736.         ;LD (PRGA+1),A
  737.         ld (curpg),a
  738. ;OUTNO
  739.         PUSH BC
  740.         LD BC,FD
  741.         OUT (C),A
  742.         POP BC
  743.         RET
  744.       endif
  745.  
  746. SetPgMask
  747.        if ATM
  748. pgmask=$+1
  749.         ld a,0
  750.         push bc
  751.         SETPGC000
  752.         pop bc
  753.         ret
  754.        else
  755.        LD A,PGMASK_
  756.        jp OUTME
  757.        endif
  758.  
  759.        if ATM
  760. SetPgMask8000
  761.         ld a,(pgmask)
  762.         push bc
  763.         SETPG8000
  764.         pop bc
  765.        ret
  766. SetPgTexture8000
  767. pg1=$+1
  768.         ld a,0
  769.         push bc
  770.         SETPG8000
  771.         pop bc
  772.        ret
  773. SetPgTextureC000
  774.         ld a,(pg1)
  775.         push bc
  776.         SETPGC000
  777.         pop bc
  778.        ret
  779. SetPgLmn8000
  780. pg2=$+1
  781.         ld a,0
  782.         push bc
  783.         SETPG8000
  784.         pop bc
  785.        ret
  786. SetPgMuzC000
  787.         ld a,(pg2) ;TODO отдельная страница
  788.         push bc
  789.         SETPGC000
  790.         pop bc
  791.        ret
  792.        endif
  793.  
  794. RND
  795.         PUSH de
  796.         PUSH HL
  797. ;Patrik Rak
  798. rndseed1=$+1
  799.         ld  hl,0xA280   ; xz -> yw
  800. rndseed2=$+1
  801.         ld  de,0xC0DE   ; yw -> zt
  802.         ld  (rndseed1),de  ; x = y, z = w
  803.         ld  a,e         ; w = w ^ ( w << 3 )
  804.         add a,a
  805.         add a,a
  806.         add a,a
  807.         xor e
  808.         ld  e,a
  809.         ld  a,h         ; t = x ^ (x << 1)
  810.         add a,a
  811.         xor h
  812.         ld  d,a
  813.         rra             ; t = t ^ (t >> 1) ^ w
  814.         xor d
  815.         xor e
  816.         ld  h,l         ; y = z
  817.         ld  l,a         ; w = t
  818.         ld  (rndseed2),hl
  819.         POP HL
  820.         POP de
  821.         RET
  822.  
  823. RNDA
  824.         PUSH BC
  825.         LD C,A
  826.         CALL RND
  827.         SUB C
  828.         JR NC,$-1
  829.         ADD A,C
  830.         POP BC
  831.         RET
  832.  
  833. unsetwms
  834.        ld a,(gamestate)
  835.        cp STATE_FLY
  836.        ret z
  837.        call ForcedUnDrawWormsInMap
  838.        call UnDrawWormsDataInMap
  839.        ld a,STATE_FLY
  840.        ld (gamestate),a
  841.  
  842.         ld a,80
  843.         call RND
  844.        add a,80
  845.         ld e,a ;y0
  846.         call RND
  847.         ld c,a ;x0low
  848.         xor a
  849.         sla c
  850.         rla
  851.         sla c
  852.         rla
  853.         ld b,a ;bc=x0
  854.         ld a,40
  855.         call RNDA
  856.         add a,10
  857.         ld d,a ;d=R
  858.          ;ld bc,200
  859.          ;ld e,100
  860.         call UnDrawCircleInMap
  861.  
  862.         LD HL,WORMXY
  863. unsetwms0
  864.         ;POP BC ;SPRITE (lsb=xlow*32)
  865.         ;POP HL ;COORDS
  866.         ;POP DE ;SPEED
  867.         ld c,(hl)
  868.         inc l
  869.         ld b,(hl) ;spritehsb
  870.         inc l
  871.         dec b
  872.         ret z
  873.         inc b
  874.         ld a,(hl) ;x
  875.         inc l
  876.         inc l
  877.         inc l
  878.        cp XWID
  879.        jr nc,unsetwms_skip
  880.         call RND
  881.         and 7
  882.         sub 4
  883.         ld c,a
  884.         call RND
  885.         and 7
  886.         sub 7;4
  887.         ld b,a ;dy
  888.         dec l
  889.         ld (hl),c
  890.         inc l
  891.         ld (hl),b
  892. unsetwms_skip
  893.         inc l
  894.         jr unsetwms0
  895.  
  896. SETWMS
  897. ;чтобы считывать XY в случайном порядке, будем переставлять случайно несколько раз с первым
  898.         ld b,100
  899. SETWMS_SHUFFLE0
  900.         ld hl,TXY
  901.         xor a
  902.         sub l
  903.         srl a ;число объектов
  904.         call RNDA
  905.         add a,a
  906.         cpl
  907.         ld e,a
  908.         dec e
  909.         ld d,h
  910.         ld c,(hl)
  911.         ld a,(de)
  912.         ld (hl),a
  913.         ld a,c
  914.         ld (de),a
  915.         inc l
  916.         inc e
  917.         ld c,(hl)
  918.         ld a,(de)
  919.         ld (hl),a
  920.         ld a,c
  921.         ld (de),a
  922.         djnz SETWMS_SHUFFLE0
  923.  
  924.         LD HL,WORMXY
  925.         LD DE,TXY
  926.         LD B,0
  927. SWMS0   LD A,(DE) ;x from TXY (до 186?)
  928.        ;ld a,l
  929.         INC E
  930.         LD C,A
  931. ;SWMSAp1=$+1
  932.         LD A,#80
  933.         ;SRL C
  934.         ;RRA
  935.         LD (HL),A ;xlow*64;32 (was for sprite)
  936.         INC HL
  937.         LD (HL),sprworm_0/256;BOMBWMS/256+1 ;sprite
  938.        ld a,e
  939.        cp -2*4 ;4 mines (last in the list)
  940.        jr c,$+4
  941.        LD (HL),sprmine_0/256;BOMBWMS/256+1 ;sprite
  942.         INC HL
  943.         LD (HL),C ;xhigh
  944.         INC HL
  945.         LD A,(DE) ;y from TXY
  946.        ;ld a,l
  947.         LD (HL),A ;y
  948.         INC HL
  949.         LD (HL),B;0 ;dx
  950.         INC HL
  951.         LD (HL),SPRLIST_STAYING ;dy
  952.         INC HL
  953.         INC E
  954.         JR NZ,SWMS0
  955.         INC HL
  956.         LD (HL),1 ;end of list (impossible xlow)
  957.        inc hl
  958.        inc hl
  959.        inc hl
  960.        inc hl
  961.        ld (hl),SPRLIST_END ;end of list (impossible dy)
  962.         ;LD HL,SWMSAp1
  963.         ;LD A,(HL)
  964.         ;SUB -2
  965.         ;OR #80
  966.         ;LD (HL),A ;"рандомная" младшая часть x
  967.         LD HL,CUWORMS
  968. MKCUW0  XOR A
  969. MKCUW1  LD (HL),B ;team 0..3
  970.         INC HL
  971.         LD (HL),A ;worm 0..3 in team
  972.         INC HL
  973.         LD (HL),150 ;health
  974.         INC HL
  975.         LD (HL),0 ;???
  976.         INC HL
  977.         LD (HL),10 ;???
  978.         INC HL
  979.         INC HL
  980.         INC A ;next worm in team
  981.         CP 4
  982.         JR C,MKCUW1
  983.         INC B
  984.        ld a,b
  985.        cp 4 ;костыль ;FIXME for 2 or 3 teams
  986.         ;CP B ;4 teams ;FIXME for 2 or 3 teams
  987.         JR NZ,MKCUW0
  988.         RET
  989.  
  990. ;offint:
  991. MOUSEX  DW 0
  992. MOUSEY  DB 0
  993.  
  994. NUMFONTCHARSZ=16;8
  995.  
  996. ResetTime
  997.         LD HL,6*NUMFONTCHARSZ*256+(0*NUMFONTCHARSZ) ;"60"
  998.         LD (curtime),HL
  999.         LD A,50
  1000.         LD (curtimeframe),A
  1001.         jp Hud_ResetTime
  1002.  
  1003. TIME
  1004. curtime=$+1
  1005.         LD BC,6*NUMFONTCHARSZ*256+(0*NUMFONTCHARSZ) ;"60"
  1006.         LD A,C
  1007.         INC A
  1008.         ret z ;JR Z,PTIMOUT
  1009. curtimeframe=$+1
  1010.         LD A,50
  1011.         DEC A
  1012.         JR NZ,$+4
  1013.         LD A,50
  1014.         LD (curtimeframe),A
  1015.         ret nz ;JR NZ,TIMPR
  1016.         LD A,C
  1017.         SUB NUMFONTCHARSZ;8
  1018.         LD C,A
  1019.         JR NC,TIMEok
  1020.         LD C,9*NUMFONTCHARSZ;8
  1021.         LD A,B
  1022.         SUB NUMFONTCHARSZ;8
  1023.         LD B,A
  1024.         JR NC,TIMEok
  1025.         LD HL,MESTIM
  1026.         CALL MTITLE
  1027.         LD A,-1
  1028.         LD (curtime),A
  1029.         jp Hud_UnDrawTime
  1030. TIMEok  LD (curtime),BC
  1031.         ret
  1032.  
  1033.  
  1034.  
  1035.        if FASTMAPPER
  1036. MAKELDI
  1037.         PUSH BC
  1038.         LD (HL),225
  1039.         INC HL
  1040.         LD B,15
  1041. MLDI1   LD (HL),225
  1042.         INC HL
  1043.         LD (HL),34
  1044.         INC HL
  1045.         LD (HL),E
  1046.         INC HL
  1047.         LD (HL),D
  1048.         INC HL
  1049.         INC E
  1050.         INC E
  1051.         DJNZ MLDI1
  1052.         CALL DDE
  1053.         POP BC
  1054.         DJNZ MAKELDI
  1055.         DEC HL
  1056.         DEC HL
  1057.         CALL READER
  1058.         LD SP,IX
  1059.         RET
  1060.         NOP
  1061.         RET
  1062.        endif
  1063.  
  1064.        if FASTMAPPER
  1065. READER
  1066. ;генерация в HL куска кода, заданного после CALL (0 = конец куска)
  1067.         EX DE,HL
  1068.         EX (SP),HL
  1069.         DEC DE
  1070. READ0   INC DE
  1071.         LD A,(HL)
  1072.         LD (DE),A
  1073.         INC HL
  1074.         OR A
  1075.         JR NZ,READ0
  1076.         EX (SP),HL
  1077.         EX DE,HL
  1078.         RET
  1079.        endif
  1080.  
  1081. TLAND   DB 18,"CREATING LANDSCAPE"
  1082. MESHOM  DB 17,"2X HOMING MISSILE"
  1083. MESWHE  DB 16,"NOWHERE TO WORM!"
  1084. MESTIM  DB 11,"TIME IS OUT"
  1085.         db 0
  1086. MESDIE  DB "123456789012 IS AN EX-WORM"
  1087. MESTEAM
  1088.         DB "1234567890123456 TEAM IS NO MORE"
  1089. TEAMLEN=16
  1090. CUTEAMS ;каждая надпись по TEAMLEN символов
  1091.         DB "ALONE CODER     "
  1092.         DB "DAVE            "
  1093.         DB "WORMS           "
  1094.         DB "THE FARM        "
  1095.  
  1096. NAMES   DB "ALCO        "
  1097.         DB "ALCO2       "
  1098.         DB "ALCO3       "
  1099.         DB "ALCO4       "
  1100.         DB "DAVE        "
  1101.         DB "D2          "
  1102.         DB "D3          "
  1103.         DB "D4          "
  1104.         DB "FLAT        "
  1105.         DB "EARTH       "
  1106.         DB "TAPE        "
  1107.         DB "WOOD        "
  1108.         DB "MOO         "
  1109.         DB "HORSE       "
  1110.         DB "PIGGY       "
  1111.         DB "CHICKEN     "
  1112.        ;db "BOMBA       "
  1113.        ;db "BOMBA       "
  1114.        ;db "BOMBA       "
  1115.        ;db "BOMBA       "
  1116.  
  1117. numfont
  1118.         include "numfont.ast"
  1119.        
  1120.        if !ATM
  1121.         include "panel.ast" ;в 48K версии можно несъёмную панель (без панелей оружия)
  1122.        endif
  1123.  
  1124.         include "input.asm"
  1125.         include "mkmap.asm"
  1126.        if ATM
  1127.         include "mkmapatm.asm"
  1128.        else
  1129.         include "mkmap6912.asm"
  1130.        endif
  1131.         include "hud.asm"
  1132.        if ATM
  1133.         include "hudatm.asm"
  1134.        else
  1135.         include "hud6912.asm"
  1136.        endif
  1137.        display "fast procedures: ",$,">=0x8000"
  1138.         include "drawmap.asm"
  1139.        if ATM
  1140.         include "drawmapatm.asm"
  1141.         include "bgpushxy.asm"
  1142.         include "../../_sdk/file.asm"
  1143.         include "../../_sdk/bmp.asm"
  1144.         include "mem.asm"
  1145.        else
  1146.         include "drawmap6912.asm"
  1147.        endif
  1148.         include "drawinmap.asm"
  1149.        if ATM
  1150.         include "drawinmapatm.asm"
  1151.        else
  1152.         include "drawinmap6912.asm"
  1153.        endif
  1154.         include "logic.asm"
  1155.  
  1156.        if ATM
  1157. BLANK   DS MASKWID ;BLANK - пустая строка маски (небо) шириной MASKWID
  1158.        else
  1159.         align 256
  1160. IMTAB   DS 257,$/256+1
  1161. BLANK   DS $/256-1 ;BLANK - пустая строка маски (небо) шириной MASKWID
  1162. IMER
  1163. ;restore stack from de
  1164. ;if sp=screen, fill with 0
  1165. ;if critical section, unwind de/bc and restore from de/bc
  1166.         ld (imerhl),hl
  1167.         pop hl
  1168.         ld (imerjp),hl
  1169.         ld (imersp),sp
  1170.         ld sp,INTSTACK
  1171.        push BC
  1172.        push DE
  1173.        push HL
  1174.        PUSH AF
  1175.       if !ATM
  1176.         ld a,l
  1177.         sub x6line_startcritical&0xff
  1178.         ld a,h
  1179.         sbc a,x6line_startcritical/256
  1180.         jr c,IMERnocritical
  1181.         ld a,l
  1182.         sub x6line_endcritical&0xff
  1183.         ld a,h
  1184.         sbc a,x6line_endcritical/256
  1185.         jr nc,IMERnocritical
  1186.         ld a,(x6line_restorede_startcritical+x6line_startcritical)&0xff
  1187.         sub l
  1188.         ld l,a
  1189.         ld a,((x6line_restorede_startcritical+x6line_startcritical)/256)&0xff
  1190.         sbc a,h
  1191.         ld h,a
  1192.        pop af
  1193.        push af
  1194.        ld (IMERcriticaljp),hl
  1195.        ld hl,IMERcritical_restorede ;jp (hl)=restore de, ret=restore bc
  1196. IMERcriticaljp=$+1
  1197.        call 0 ;unwind de ;addr=x6line_restorede_startcritical-(imerjp-x6line_startcritical)
  1198.         ld hl,(imersp)
  1199.         dec hl
  1200.         ld (hl),b
  1201.         dec hl
  1202.         ld (hl),c
  1203.        jp IMERcriticalq
  1204. IMERcritical_restorede
  1205. ;after jp (hl)
  1206.        pop af ;skip return addr
  1207. IMERnocritical
  1208.       endif
  1209.         ld hl,(imersp)
  1210.        dec hl
  1211.        dec hl
  1212.         bit 7,h
  1213.         jr nz,IMERnozerostack
  1214.         ld de,0
  1215.       if !ATM
  1216.        ld a,l
  1217.        inc a
  1218.        jr nz,IMERnozerostack
  1219.        ld a,h
  1220.        sub 0x50
  1221.        cp 7
  1222.        jr nc,IMERnozerostack
  1223. ;при запарывании 0x50ff..0x56ff (ATM=0)
  1224. ;50ff - берём из 51ff
  1225. ;51ff - берём из 50ff
  1226. ;52ff - берём из 51ff
  1227. ;53ff - берём 0f
  1228. ;прочие - берём ff
  1229.         ;call ReDrawEnergy ;при запарывании 0x50ff..0x56ff
  1230.         cp 3
  1231.         ld e,0x0f
  1232.         jr z,IMERnozerostack
  1233.         ld e,0xff
  1234.         jr nc,IMERnozerostack
  1235.         cpl
  1236.         and 1
  1237.         add a,0x50
  1238.         ld b,a
  1239.         ld c,l
  1240.         ld a,(bc)
  1241.         ld e,a
  1242.       endif
  1243. IMERnozerostack
  1244.         ld (hl),e
  1245.         inc hl
  1246.         ld (hl),d
  1247. IMERcriticalq
  1248.         LD hl,curwater
  1249.         ld a,(hl)
  1250.         SUB -16
  1251.         LD (hl),A
  1252.        ex af,af' ;'
  1253.        PUSH AF
  1254.         CALL MOUSE
  1255.         call TIME
  1256.         ld hl,timer
  1257.         inc (hl)
  1258.         ld a,(curpg)
  1259.         push af
  1260.         push ix
  1261.         push iy
  1262.         ld a,PGLMN
  1263.         call OUTME
  1264. muzpatch=$+1
  1265.         ld a,0
  1266.         or a
  1267.         call z,muz+5
  1268.         pop iy
  1269.         pop ix
  1270.         pop af
  1271.         call OUTME
  1272.        pop AF
  1273.        ex af,af' ;'
  1274.        pop AF
  1275.        POP HL
  1276.        pop DE
  1277.        pop BC
  1278. imersp=$+1
  1279.         ld sp,0
  1280. imerhl=$+1
  1281.         ld hl,0
  1282.         EI
  1283. imerjp=$+1
  1284.         jp 0
  1285.        endif
  1286.  
  1287.        if ATM
  1288. genpush_newpage
  1289. ;заказывает страницу, заносит в tpushpgs, a=pg
  1290.         push bc
  1291.         push de
  1292.         push hl
  1293.         push ix
  1294.         OS_NEWPAGE
  1295.         pop ix
  1296.         ld a,e
  1297.         ld (ix),a
  1298.         ld de,4
  1299.         add ix,de
  1300.         pop hl
  1301.         pop de
  1302.         pop bc
  1303.         ret
  1304.  
  1305. RestoreMemMap3
  1306.         ;ld a,CC_PAGE3;0
  1307.         ;jp setpgc000;SETPG32KHIGH
  1308.         ret
  1309.  
  1310.         include "grass16.ast"
  1311. ;pal
  1312. ;DDp palette: %grbG11RB(low),%grbG11RB(high), инверсные
  1313.         ;STANDARDPAL
  1314.         include "pal.ast"
  1315. res_path
  1316. ;в этом относительном пути будут лежать все загружаемые данные игры
  1317.         db "worms"
  1318.         db 0
  1319. fnpg1
  1320.         db "hicode.c",0
  1321. fnpg2
  1322.         db "hicode2.c",0
  1323.        
  1324.         align 256 ;for setpixel
  1325. tpushpgs
  1326.         ds 128 ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
  1327.  
  1328.         align 256
  1329. trecodebyteleft
  1330.         dup 256
  1331. ;%00003210 => %.3...210
  1332. _3=$&8
  1333. _210=$&7
  1334.         db (_3*0x08) + (_210*0x01)
  1335.         edup
  1336.        
  1337. trecodebyteright
  1338.         dup 256
  1339. ;%00003210 => %3.210...
  1340. _3=$&8
  1341. _210=$&7
  1342.         db (_3*0x10) + (_210*0x08)
  1343.         edup
  1344.  
  1345. bgpush_bmpbuf ds 1024;320 ;заголовок bmp или одна строка
  1346.        endif
  1347.  
  1348.         display "endcode=",$
  1349.  
  1350.        if !ATM
  1351.         align 256
  1352.         include "texture.ast" ;только при генерации карты (0x800 байт) (можно урезать (как на Амиге) или сжать?)
  1353.        endif
  1354.         align 256
  1355.         include "sprites.ast"
  1356. sprpie
  1357.         INCBIN "gug.bin" ;только при генерации карты (на 48K можно убрать)
  1358.        
  1359.         display "endgfx=",$
  1360. endall
  1361.  
  1362.        if !ATM
  1363.         ORG 0x6000
  1364.         jp GO
  1365.        endif
  1366.  
  1367.         page PGHICODE
  1368.         ORG 0xc000
  1369. hicode_begin
  1370.        if !ATM
  1371.         nop ;TODO в этой странице тоже что-нибудь
  1372.        else
  1373.         include "texforrest.ast"
  1374.         include "panel16.ast"
  1375.        endif
  1376. hicode_end
  1377.  
  1378.         page PGLMN
  1379.         ORG 0xc000
  1380. hicode2_begin
  1381. LMNS
  1382.         INCBIN "lmn.bin" ;>7K! в формате SCUT
  1383. muz
  1384.         include "ptsplay.asm"
  1385. MDLADDR
  1386.         incbin "music/WORMS8.pt3"        
  1387. ;GUG
  1388. ;        INCBIN "gug.bin" ;только при генерации карты (на 48K можно убрать)
  1389. hicode2_end
  1390.  
  1391.        if !ATM
  1392.         page 0
  1393.         savebin "code.c",begin,endall-begin
  1394.         page PGHICODE;6
  1395.         savebin "hicode.c",hicode_begin,hicode_end-hicode_begin
  1396.         page PGLMN;4
  1397.         savebin "hicode2.c",hicode2_begin,hicode2_end-hicode2_begin
  1398.        else
  1399.         page 0
  1400.         savebin "worms.com",begin,endall-begin
  1401.         page PGHICODE;6
  1402.         savebin "worms/hicode.c",hicode_begin,hicode_end-hicode_begin
  1403.         page PGLMN;4
  1404.         savebin "worms/hicode2.c",hicode2_begin,hicode2_end-hicode2_begin
  1405.        endif
  1406.  
  1407.         LABELSLIST "../../../us/user.l",1
  1408.