?login_element?

Subversion Repositories NedoOS

Rev

Rev 1517 | Blame | Compare with Previous | Last modification | View Log | Download

  1.             DEVICE ZXSPECTRUM1024
  2. TCP=1
  3. LOGGING=0
  4.         ifdef CLIENT
  5. VIRTUALKEYS=1
  6.         else
  7. VIRTUALKEYS=0
  8.         endif
  9. JOYMASK_SELECT=0b00100000
  10. JOYMASK_START =0b00010000
  11. JOYMASK_FIRE  =0b10000000
  12. JOYMASK_FIRE2 =0b01000000
  13. JOYMASK_UP    =0b00001000
  14. JOYMASK_DOWN  =0b00000100
  15. JOYMASK_LEFT  =0b00000010
  16. JOYMASK_RIGHT =0b00000001
  17. ;7 - A (A)
  18. ;6 - B (S)
  19. ;5 - Select (Space)
  20. ;4 - Start (Enter)
  21. ;3 - Up (7)
  22. ;2 - Down (6)
  23. ;1 - Left (5)
  24. ;0 - Right (8)
  25.  
  26. MANYLIVES=0;1 ;убрать при релизе!!!
  27. TILES87=0
  28. TILEHGT=8-TILES87
  29. DRAWFOREST=1
  30. KEMPSTON=1
  31.             DEFINE  ProjName        ZXBattleCity
  32.             DEFINE  ProjVer         1_6
  33.  
  34.         include "../../_sdk/sys_h.asm"
  35.  
  36. ;************************* Возможные номера ошибок (errno)*************************
  37. SHUT_RDWR               EQU 2
  38. ERR_EAGAIN              EQU 35          ;/* Try again */
  39. ERR_EWOULDBLOCK EQU ERR_EAGAIN  ;/* Operation would block */
  40. ERR_INTR                EQU 4
  41. ERR_NFILE               EQU 23
  42. ERR_ALREADY     EQU 37
  43. ERR_NOTSOCK     EQU 38
  44. ERR_EMSGSIZE    EQU 40    ;/* Message too long */
  45. ERR_PROTOTYPE   EQU 41
  46. ERR_AFNOSUPPORT EQU 47
  47. ERR_HOSTUNREACH EQU 65
  48. ERR_ECONNABORTED EQU    53      /* Software caused connection abort */
  49. ERR_CONNRESET   EQU 54
  50. ERR_NOTCONN     EQU 57
  51.  
  52. ;************************* Протоколы соединений *************************
  53. SOCK_STREAM EQU 0x01            ;tcp/ip
  54. SOCK_ICMP       EQU 0x02                ;icmp
  55. SOCK_DGRAM      EQU 0x03                ;udp/ip
  56.  
  57. AF_INET EQU 2
  58.  
  59. TOPYLOAD=32;0
  60. TOPY=0;32
  61. TOPYVISIBLE=TOPY+8
  62.         if TILES87
  63. MAXY=(30-2)*8;224
  64.         else
  65. MAXY=(26-2)*8
  66.         endif
  67.  
  68. scrbase=0x4000
  69. sprmaxwid=32
  70. sprmaxhgt=32
  71. scrwid=160 ;double pixels
  72. scrhgt=200
  73.  
  74. pushbase=0x8000
  75.         macro SETPGPUSHBASE
  76.         SETPG8000
  77.         endm
  78.  
  79.         macro RECODEBYTE
  80.         ld a,(de)
  81.         ld ($+4),a
  82.         ld a,(trecodebyteright)
  83.         ld c,a
  84.         dec de
  85.         ld a,(de)
  86.         dec de
  87.         ld ($+4),a
  88.         ld a,(trecodebyteleft)
  89.         or c
  90.         endm        
  91.  
  92. STACK=0x3ff0
  93. tempsp=0x3f06 ;6 bytes for prspr
  94. INTSTACK=0x3f00
  95.  
  96. ;TILEFLAGBIT=2
  97. TILEFLAG0=0x18
  98. TILEFLAG1=0x1c
  99.  
  100. WATERANIMTILE=102
  101. NWATERANIMTILES=2
  102.  
  103. SPSIZ16=2
  104. SPACT=32
  105. SPSIZ8=0
  106.  
  107. SPRDROP=256+34
  108. SPRBULLETUP=52
  109. SPRBULLETRIGHT=54
  110.  
  111. SPRCLOUD0=256+44
  112. SPRCLOUD1=256+46
  113.  
  114. ;сейчас спрайты лежат так (реально есть только чётные номера):
  115. ;0..31,64..95,... (my tank level 0,1, enemy1) в spr0 (+256 - mirror hrz, +512 - mirror vert)
  116. ;32..63,96..127,... в spr1 (+256 - mirror hrz, +512 - mirror vert)
  117. ;TODO:
  118. ;256+ (my tank level 2 (+16),3 (+128+16), enemy2 (+0)) в spr2
  119. ;512+ (enemy 3 (+0),4 (+64),5 (+128)) в spr3
  120.  
  121. SPRMYTANKLEVEL0=0
  122. SPRMYTANKLEVEL1=16
  123. SPRMYTANKLEVEL2=256+16
  124. SPRMYTANKLEVEL3=256+128+16
  125.  
  126. ;my tank level 0,1,2,3 - sprite 0,16,256+16,256+128+16
  127. ;enemy tank sprites (add 8 for red version):
  128. ;SPRENEMY1=0+8;256+128
  129. ;SPRENEMY2=0+16;256+128+128
  130. ;SPRENEMY3=0+24;256+128+128+128
  131. ;SPRENEMY4=64+0;256+128+256+128
  132. ;SPRENEMY5=64+8;256+128+256+256
  133. SPRENEMY1=0+64;256+128
  134. SPRENEMY2=256;256+128+128
  135. SPRENEMY3=512;256+128+128+128
  136. SPRENEMY4=512+64;256+128+256+128
  137. SPRENEMY5=512+128;256+128+256+256
  138.  
  139. SPRMEGASHIP=32;256+36
  140.  
  141. SPRBONUS0=96;80;256+128+16
  142. SPRBONUS1=98;82;256+128+18
  143. SPRBONUS2=100;84;256+128+20
  144. SPRBONUS3=102;86;256+128+22
  145. SPRBONUS4=104;88;256+128+24
  146. SPRBONUS5=106;90;256+128+26
  147. SPRBONUS6=108;92;256+128+28
  148. SPRBONUS7=110;94;256+128+30
  149. SPRBONUS8=112;192+32;256+128+32
  150.  
  151. SPRSTAR0=120;256+48
  152. SPRSTAR1=122;256+50
  153. SPRSTAR2=124;256+52
  154. SPRSTAR3=126;256+54
  155.  
  156. SPRENE0=128+64+46;256+128+46
  157. SPRENE1=128+64+48;256+128+48
  158. SPRENE2=128+64+50;256+128+50
  159. SPRENE3=128+64+52;256+128+52
  160. SPRENE4=128+64+54;256+128+54
  161.  
  162. SPRBOOM0=56
  163. SPRBOOM1=58
  164. SPRBOOM2=60
  165. SPRBOOM0_=48;256+56 ;big boom
  166. SPRBOOM2_=50;256+60
  167.  
  168. SPRGAMEOVER0=256+40
  169. SPRGAMEOVER1=256+42
  170.  
  171. BYTESPERTILE=1;2
  172. BYTESPERTILELINE=(BYTESPERTILE*64);256
  173.  
  174.         macro PRCHAR_TILEMAP_HL
  175.         ld (hl),a
  176.          set 3,h
  177.          ld (hl),TILEFLAG1 ;при печати тайла ставим биты изменения обоих экранов (а при печати спрайта надо только на текущем экране)
  178.          res 3,h
  179.          set 4,h
  180.          ld (hl),TILEFLAG1 ;при печати тайла ставим биты изменения обоих экранов (а при печати спрайта надо только на текущем экране)
  181.          res 4,h
  182.         endm
  183.  
  184.         macro TILEMAPLINEUP
  185.         ;LD     BC,-256
  186.         LD      BC,-BYTESPERTILELINE;-256
  187.         ADD     HL,BC
  188.         endm
  189.  
  190.         macro TILEMAPLINEDOWN
  191.         ;LD     BC,256
  192.         LD      BC,BYTESPERTILELINE;256
  193.         ADD     HL,BC
  194.         endm
  195.  
  196.         macro TILEMAPLEFTLINEDOWN
  197.         ;LD     BC,256-2
  198.         LD      BC,BYTESPERTILELINE-BYTESPERTILE;256-2
  199.         ADD     HL,BC
  200.         endm
  201.  
  202.         macro TILEMAPLEFT
  203.         dup BYTESPERTILE
  204.         dec hl
  205.         edup
  206.         ;dec hl
  207.         endm
  208.  
  209.         macro TILEMAPRIGHT
  210.         dup BYTESPERTILE
  211.         inc hl
  212.         edup
  213.         ;inc hl
  214.         endm
  215.  
  216.         org PROGSTART
  217. begin
  218.         jp MAINGO ;patched by prspr
  219. MAINGO
  220.         ld sp,STACK
  221.         ;OS_HIDEFROMPARENT
  222.         ld e,0 + 0x80 ;EGA + keep
  223.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode) +8=noturbo, +0x80=keep gfx pages
  224.         ld de,path
  225.         OS_CHDIR
  226.         call clstwo
  227.  
  228.         OS_GETMAINPAGES
  229. ;dehl=номера страниц в 0000,4000,8000,c000
  230.         ld a,e
  231.         LD (pgmain4000),A
  232.         ld a,h
  233.         LD (pgmain8000),A
  234.         ld a,l
  235.         LD (pgmainc000),A
  236.  
  237.         call newpage
  238.         ld (pgmuzmain),a
  239.         call newpage
  240.         ld (pgmuzend),a
  241.         call newpage
  242.         ld (pgspr0),a
  243.         call newpage
  244.         ld (pgspr1),a
  245.         call newpage
  246.         ld (pgspr2),a
  247.         call newpage
  248.         ld (pgspr3),a
  249.         call newpage
  250.         ld (pgtiles),a
  251.         call newpage
  252.         ld (pglvl0),a
  253.         call newpage
  254.         ld (pglvl1),a
  255.         call newpage
  256.         ld (pglvl2),a
  257.         call newpage
  258.         ld (pgarea),a
  259.  
  260.         call newpage
  261.         ld (pgfake),a ;эту страницу можно будет запарывать при отрисовке спрайтов с клипированием
  262.         ld (pgfake2),a      
  263.  
  264.         CALL    INSREADY                                ;Loading Hi-Score table, music, palette, sound FX and palette initialisation
  265.         LD      HL,48000                                ;Sound FX initialisation
  266.         CALL    AFXINIT
  267.        
  268.         ld hl,prsprqwid
  269.         ld (0x0101),hl ;спрайты в файле подготовлены так, что выходят в 0x0100
  270.  
  271.        ifdef CLIENT
  272.        
  273.        if TCP
  274.        if CLIENT
  275.         call getipfromcmd
  276. ;create socket:
  277. CONNECTIONERROR
  278.         ld de,SOCK_STREAM+(AF_INET<<8)
  279.         OS_NETSOCKET
  280.         ld a,l
  281.         or a
  282.         jp m,CONNECTIONERROR;?C_EXIT
  283.         ld (datasoc),a
  284.         LD DE,web_ia
  285.         OS_NETCONNECT
  286.          ld a,l ;DimkaM 12.03.2019
  287.         or a
  288.         jp p,connect_ok
  289. createsoc_err
  290.         ld a,(datasoc)
  291.         ld e,0
  292.         OS_NETSHUTDOWN
  293.         jp CONNECTIONERROR
  294. ;CONNECTIONERROR
  295. connect_ok
  296.        else ;SERVER
  297. ;SOCKET  OS_NETSOCKET(unsigned int);
  298. ;#define socket(domain, type, protocol) OS_NETSOCKET((domain<<8)+type)
  299.         ;ld bc,1 ;domain???
  300.         LD DE,513 ;type???
  301.         OS_NETSOCKET ;Подключить TCP/IP сокет к хосту.???
  302.         ld a,l
  303.         or a
  304.         jp m,CONNECTIONERROR;?C_EXIT
  305.         LD (soc),A
  306.         ;a=socket
  307.         LD DE,web_ia
  308. ;signed char OS_BIND(const struct sockaddr_in * addr, SOCKET socket);
  309. ;#define bind(socket, addr, address_len) OS_BIND(addr,socket)
  310.         OS_BIND ;Присвоение сокету конкретного номера исходящего порта.
  311.         LD a,(soc) ;socket
  312.         ;LD DE,0 ;backlog???
  313. ;signed char OS_LISTEN(int, SOCKET socket);
  314. ;#define listen(socket, backlog) OS_LISTEN(backlog,socket)
  315.         OS_LISTEN ;Включить режим прослушивания исходящего порта(режим сервера) TCP/IP сокета.
  316. WAIT_CLIENTS0
  317.         LD a,(soc) ;socket
  318.         ;LD DE,0 ;addr???
  319. ;SOCKET OS_ACCEPT(const struct sockaddr_in * addr, SOCKET socket);
  320. ;#define accept(socket, addr, address_len) OS_ACCEPT(addr,socket)
  321.         OS_ACCEPT ;ждём, когда подсоединятся
  322.         BIT 7,L
  323.         JR Z,ESTABLISHED
  324.         CP ERR_EAGAIN
  325.         JP NZ,ERR_EXIT  ;обработка ошибки
  326.         OS_YIELD                ;не обязательно. Если время реагирования на подключение не критично,
  327.                                                 ;то отдадим квант времени системе.
  328.         JR WAIT_CLIENTS0        ;никто не подключился, ждём
  329. ESTABLISHED
  330.         LD A,L                          ;удачно
  331.         LD (datasoc),A  ;сохраняем дескриптор сокета.
  332. ;       Возвращаемые значения в регистрах:
  333. ;               L - SOCKET при положительном значении, при отрицательном значении  - функция завершилась с ошибкой.
  334. ;               А - errno при ошибке.
  335. ;       Возможные ошибки:
  336. ;               ERR_NOTSOCK             - не действительный дескриптор сокета
  337. ;               ERR_ECONNABORTED        - общая ошибка сокета
  338. ;               ERR_EAGAIN                      - входящих подключений пока нет
  339. CONNECTIONERROR
  340. ERR_EXIT
  341.        endif
  342.        
  343.        else ;UDP
  344.        
  345.         ld de,0x0203
  346.         OS_NETSOCKET
  347.         ld a,l
  348.         ld (soc),a
  349.         or a
  350.         jp m,inet_exiterr_nosoc
  351. inet_exiterr_nosoc ;TODO
  352.        if CLIENT==0
  353.         ld a,(soc)
  354.         LD DE,port_ia
  355.         OS_BIND
  356.         ld a,l
  357.         or a
  358.         jp m,inet_exiterr
  359. inet_exiterr ;TODO
  360.        endif
  361.        
  362.        endif ;UDP
  363.        endif
  364.  
  365.         JP      PRESTART;S
  366.  
  367. newpage
  368.         OS_NEWPAGE
  369.         ld a,e
  370.         ret
  371.  
  372. clstwo
  373.          ld e,1
  374.          call clsone
  375.          ld e,0
  376. clsone
  377.          OS_SETSCREEN
  378.          ld e,0
  379.          OS_CLS
  380.          ret
  381.  
  382.         ;display $
  383.         ds 0x200-$
  384. sprlist
  385.         ds 85*6
  386. sprlistsz=$-sprlist
  387. ;+0: y
  388. ;+1: 2(ysize:SPSIZ16) +0x20(SPACT) +0x40(deact) +0x80(mirrorvert) +1(SPSIZBS)
  389. ;+2: x
  390. ;+3: 2(xsize:SPSIZ16) +1(SPSIZBS) +0x80(mirrorhor)
  391. ;+4,5: pattern number
  392.  
  393.        macro DWBIGENDIAN data
  394.         db data/256
  395.         db data&0xff
  396.        endm
  397.  
  398.        ifdef CLIENT
  399. soc
  400.         db 0
  401. datasoc
  402.         db 0
  403.  
  404. ;TCP:
  405. curport=$+1
  406. web_ia:
  407.         defb 0
  408.         DWBIGENDIAN 20001 ;db 0,80
  409. web_ia_ip
  410.         db 192,168,1,177;127,0,0,1 ;ip (big endian) ;connect to 192.168.1.177
  411.         ds 8 ;reserved
  412.  
  413. getipfromcmd
  414.         ld hl,COMMANDLINE
  415.         call skipword
  416.         ld a,(hl)
  417.         or a
  418.         ret z
  419.         call skipspaces
  420.         ld de,web_ia_ip
  421. ping_nextdig
  422.         call strtobyte_hltode
  423.        or a
  424.        ret nz ;error
  425.         ld a,(hl)
  426.         cp '.'
  427.         inc hl
  428.         jr z,ping_nextdig
  429.         ret
  430.  
  431. skipword
  432. ;hl=string
  433. ;out: hl=terminator/space addr
  434. skipword0
  435.         ld a,(hl)
  436.         or a
  437.         ret z ;jr z,skipwordq
  438.         sub ' '
  439.         ret z ;jr z,skipwordq
  440.         inc hl ;ldi
  441.         jr skipword0
  442.  
  443. skipspaces
  444. ;hl=string
  445. ;out: hl=after last space
  446.         ld a,(hl)
  447.         cp ' '
  448.         ret nz
  449.         inc hl
  450.         jr skipspaces
  451.  
  452. strtodigit_a ;a=FF - err
  453.         sub 0x30
  454.         jr c,str_digit_a_err
  455.         sub 10
  456.         jr nc,str_digit_a_err
  457.         add 10
  458.         ret
  459. str_digit_a_err
  460.         ld a,0xFF
  461.         ret
  462.  
  463. strtobyte_hltode ; a=0 ok a=FF error
  464.         ld a,(hl)
  465.         call strtodigit_a
  466.         inc a
  467.         or a
  468.         jr z,strtobyte_err
  469.  
  470.         dec a
  471.         ld c,a
  472.         inc hl
  473.         ld a,(hl)
  474.         call strtodigit_a
  475.         inc a
  476.         or a
  477.         jr nz,strtobyte_2digit
  478.         ld a,c
  479.         ld (de),a
  480.         xor a
  481.         inc de
  482.         ret
  483.  
  484. strtobyte_2digit
  485.         inc hl
  486.         dec a;в а вторая цифра
  487.         ex af,af' ;'
  488.         ld a,c
  489.         ld b,9
  490. strtobyte_2digit0
  491.         add c
  492.         djnz strtobyte_2digit0
  493.         ld c,a
  494.         ex af,af' ;'
  495.         add c
  496.         ld c,a
  497.  
  498.         ld a,(hl)
  499.         call strtodigit_a
  500.         inc a
  501.         or a
  502.         jr nz,strtobyte_3digit
  503.         ld a,c
  504.         ld (de),a
  505.         xor a
  506.         inc de
  507.         ret
  508. strtobyte_3digit
  509.         inc hl
  510.         dec a; в a третья цифра
  511.         ex af,af' ;'
  512.         ld a,c
  513.         ld b,9
  514. strtobyte_3digit0
  515.         add c
  516.         jr c,strtobyte_err
  517.         djnz strtobyte_3digit0
  518.         ld c,a
  519.         ex af,af' ;'
  520.         add c
  521.         jr c,strtobyte_err
  522.         ld (de),a
  523.         xor a
  524.         inc de
  525.         ret
  526. strtobyte_err
  527.         ld a,0xFF
  528.         ret
  529.  
  530.        endif ;ifdef CLIENT
  531.  
  532. PRESTART;S
  533.         ;LD     A,(ENN) ;resources loaded?
  534.         ;CP     1
  535.         ;JP     Z,ZZZZ2 ;skip load
  536.        call loadresources
  537.                         ;LD      HL,(#5CF4)                             ;Save position of Levels on disk
  538.                         ;LD             (DiskAddrLevels),HL
  539.  
  540. ;vertical scroll
  541.         call setpgsscr40008000
  542.         ld de,bgfilename
  543.         call bgpush_prepare
  544.         call setpgsmain40008000
  545.  
  546.         call swapimer      
  547.  
  548.        ifdef CLIENT
  549.        if LOGGING
  550.         ld de,fn_log
  551.         OS_CREATEHANDLE
  552.         ld a,b
  553.         ld (loghandle),a
  554.        endif
  555.        
  556.         ;OS_HIDEFROMPARENT
  557.        endif
  558.  
  559. STARTS
  560. ;сюда можем попасть из игры
  561.         ld sp,STACK
  562.  
  563.          LD A,1
  564.          LD (NEWLEVEL),A ;иначе рычит в меню
  565.          ld a,5
  566.          ld (SOUNDGO),a ;иначе остаток от рычания после гамовера?
  567.          call afxinit
  568.         LD      HL,BONUS2
  569.         LD      DE,BONUS
  570.         LD      BC,96
  571.         LDIR
  572.         ;LD     BC,PAGE3
  573.         ;LD     A,#C3
  574.         ;OUT    (C),A
  575.         call setpgc3
  576.         CALL    #C000 ;init muzmain
  577.         CALL    #CBB8 ;init muzboss
  578.         LD      A,200+24
  579.         LD      (SOUNDW),A ;time until music stops
  580.         CALL    POINTHI ;формирует в TEXT4 строку со счётом
  581.         XOR     A
  582.         LD      (NEWTAN1),A
  583.         LD      (NEWTAN2),A
  584.         LD      A,(MAP)
  585.         CP      255
  586.         JR      Z,FGF2
  587.         XOR     A ;first level
  588.          ;ld a,31 ;18"19" и 23"24" трудные
  589.         LD      (MAP),A
  590. FGF2
  591.  
  592. ZZZZ2
  593.         ;ld ix,UNITS
  594.         ;ld (ix+UNIT_YESORNOT),0
  595.          ;xor a
  596.          ;ld (sprlist+1),a ;disable sprite #0
  597.          call clearsprlist
  598.          call clstiles
  599.  
  600.         ;LD     BC,VCONFIG; CHANGE VIDEO RESOLUCION 1
  601.         ;LD     A,VID321X+1
  602.         ;OUT    (C),A
  603.         ;LD     BC,VPAGE; VRAM CHANGE
  604.         ;LD     A,#10
  605.         ;OUT    (C),A
  606.         ;LD     BC,BORDER
  607.         ;LD     A,1
  608.         ;OUT    (C),A
  609.         call border1
  610.         CALL    CLSSTART ;???
  611.         LD      A,2
  612.         LD      (FIGH),A ;какой-то признак deact спрайтов??? (потом не обнуляется!)
  613.  
  614.         ld hl,108
  615.         ld (callpush_curscroll),hl
  616.  
  617. ;Main menu cycle!
  618. ;K inject here! TODO
  619.          call doscreen
  620.          call doscreen
  621.          ;ld b,24
  622.          ;halt
  623.          ;djnz $-1
  624.        ld a,(timer)
  625.        ld (KERNSoldtimer),a
  626.        ld (scrolloldtimer),a
  627. ;цикл показа и обработки меню
  628. KERNS
  629.      ifdef CLIENT
  630.       if CLIENT
  631.        call sendjoyTMP
  632.        ld hl,menucheckkeys
  633.        call readfrominet_tojoy1joy2 ;читать ровно одно сообщение, выполнить логику. и так пока есть сообщения
  634.       else
  635.        call readfrominet_tojoy2 ;может быть принято сколько угодно сообщений - берём последнее
  636.        call sendjoy1joy2 ;в каждом цикле логики
  637.        call menucheckkeys
  638.       endif
  639.      else
  640.       call menucheckkeys
  641.      endif
  642.  
  643.       call menuchangetimer ;при окончании таймера вызывает autounpress start
  644.       call menudraw
  645.       jr KERNS
  646.  
  647. menudraw
  648.         LD      A,(STR6) ;time in startmenu
  649.         ;CP     218
  650.         ;CALL   Z,STR77 ;autounpress start
  651.         ;CP     219
  652.         ;CALL   Z,menu_printcopyrights;STR7 ;print text TEXT3 (copyrights), TEXT4 (hiscores)
  653.         CP      220
  654.         JP      nc,noscroll;STR4
  655.         ld hl,(callpush_curscroll)
  656.         bit 7,h
  657.         jr nz,noscroll;STR4 ;end of scroll
  658.       call menuscroll
  659.        ;call setpgc3
  660.        ;call #C000 ;init muzmain
  661.        ld a,(SOUNDW)
  662.        or a
  663.        call z,afxinit ;stop sound
  664.         ret;jp KERNS
  665. noscroll;STR4
  666.        call menuscreen_tank
  667.          call doscreen        
  668.         ret;JP KERNS ;STR44
  669.  
  670. stopscroll_draw
  671.         ld de,512-200-8
  672.         ld (callpush_curscroll),de
  673.         call bgpush_draw ;359975t
  674.         CALL menu_printcopyrights;STR7 ;print text TEXT3 (copyrights), TEXT4 (hiscores)
  675.        call menuscreen_tank
  676.          call doscreen ;содержит changescrpg и waitchangescr
  677.         ;call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  678.         ;halt
  679.         call bgpush_draw ;359975t
  680.         CALL menu_printcopyrights;STR7 ;print text TEXT3 (copyrights), TEXT4 (hiscores)
  681.         call setpgsmain40008000
  682.         ld h,-1
  683.         ld (callpush_curscroll),hl
  684.        call menuscreen_tank
  685.          jp doscreen        
  686.         ;ret
  687.        
  688.         if 1==1
  689. STR3
  690.         LD      A,(STR)
  691.         DEC     A
  692.         LD      (STR),A ;--scroll page?
  693.         LD      HL,65535-228
  694.         LD      (STR2),HL ;scroll position?
  695.         JP      STR5
  696.         endif
  697.  
  698. STR77
  699.         PUSH    AF
  700.         LD      A,1 ;start unpressed
  701.         LD      (STAKEY),A
  702.         POP     AF
  703.         RET
  704.  
  705. menuchangetimer
  706.         ld a,(timer)
  707. KERNSoldtimer=$+1
  708.         ld b,0
  709.         ld (KERNSoldtimer),a
  710.         sub b
  711.         ld c,a
  712.         ld b,0
  713.         ret z ;jr z,STR44
  714.        ld a,(STR6)
  715.       cp 220
  716.        ret nc
  717.        add a,c
  718.        ld (STR6),a ;time in start menu
  719.       cp 220
  720.         ret nc
  721.         CALL STR77 ;autounpress start
  722.         ret
  723.  
  724. menuscroll
  725.        if 1==1
  726.         ld a,(timer)
  727. scrolloldtimer=$+1
  728.         ld bc,0
  729.         ld (scrolloldtimer),a
  730.         sub c
  731.         ld c,a
  732.         ld hl,(callpush_curscroll)
  733.         ;bit 7,h
  734.         ;jr nz,STR4 ;end of scroll
  735.         ld de,512-200-8
  736.         or a
  737.         sbc hl,de
  738.         jr nc,stopscroll
  739.         call bgpush_inccurscroll ;bc=scroll increment (signed)
  740. scroll_wait0
  741.        ld a,(timer)
  742. lastscrtimer=$+1
  743.        cp 0
  744.        jr z,scroll_wait0 ;wait screen change
  745.         call bgpush_draw ;359975t
  746.         call setpgsmain40008000
  747.        ld a,(timer)
  748.        ld (lastscrtimer),a
  749.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  750.         ret;jp STR44
  751. stopscroll
  752.         call stopscroll_draw
  753. STR5
  754.        else
  755.         INC     A
  756.         LD      (STR6),A ;++time in startmenu
  757.         LD      A,(STR) ;scroll page?
  758.         CP      15
  759.         JP      Z,STR4 ;end of scroll?
  760.         LD      HL,(STR2) ;scroll position?
  761.         LD      A,H
  762.         CP      #C0
  763.         JP      Z,STR3 ;go to previous scroll page
  764.         LD      DE,256
  765.         SBC     HL,DE
  766. STR5    LD      (STR2),HL ;scroll position?
  767.        if 1==0
  768.         PUSH    HL
  769.         POP     DE
  770.         LD      HL,#C000
  771.         LD      B,51 ;wid/8-1?
  772.         LD      C,154 ;hgt-1?
  773.         LD      A,#C2
  774.         LD      (PAGEFR),A
  775.         LD      A,(STR)
  776.         LD      (PAGETO),A
  777.         LD      A,%00010001
  778.         CALL    DMASTART
  779.        endif
  780.        endif
  781. ;STR44
  782.         ret
  783.  
  784. menuscreen_tank
  785.         LD      HL,(KORM);---X
  786.         LD      BC,(KORM2);----Y
  787.        if TILES87
  788.        else
  789.         ld a,c
  790.         sub 16 ;костыль
  791.         ld c,a
  792.        endif
  793.         LD      A,(TANK) ;sprite phase
  794.         ADD     A,4;44 ;sprite pattern number
  795.         LD      D,2 ;size
  796.         CALL    PRINT
  797.         LD      A,(TANKP) ;anim timer
  798.         INC     A
  799.         CP      4
  800.         CALL    Z,TANKP2 ;next sprite phase
  801.         CP      8
  802.         CALL    Z,TANKP3 ;prev sprite phase
  803.         LD      (TANKP),A ;anim timer
  804.         ;LD     BC,TSCONFIG; SPRITE PRINT
  805.         ;LD     A,%10000000
  806.         ;OUT    (C),A
  807.         ret
  808.  
  809. menucheckkeys
  810.         CALL    EXIT ;if break, set (MAP)=31
  811.        if VIRTUALKEYS
  812.         ld a,(joy1state)
  813.         and JOYMASK_START
  814.        else
  815.         LD      HL,(Keys1PlStart)
  816.         LD      B,H
  817.         LD      C,#FE
  818.         IN      A,(C)
  819.         AND     L
  820.        endif
  821. oldkeystart1=$+1
  822.        ld c,0xff
  823.        ld (oldkeystart1),a
  824.         CALL    Z,STR8 ;press start
  825.        if VIRTUALKEYS
  826.         ld a,(joy1state)
  827.         and JOYMASK_FIRE
  828.        else
  829.         LD      HL,(Keys1PlFr)
  830.         LD      B,H
  831.         LD      C,#FE
  832.         IN      A,(C)
  833.         AND     L
  834.        endif
  835. oldkeyfire1=$+1
  836.        ld c,0xff
  837.        ld (oldkeyfire1),a
  838.         CALL    Z,STR8 ;press start
  839.         ;ret
  840. ;menucheckkeys_up_down
  841.        if VIRTUALKEYS
  842.         ld a,(joy1state)
  843.         and JOYMASK_DOWN
  844.        else
  845.         LD      HL,(Keys1PlDn)          ;LD             HL,Keys1PlDn+2
  846.         LD      B,H                                     ;LD             BC,(Keys1PlDn)
  847.         LD      C,#FE                           ;CALL   CHBIT
  848.         IN      A,(C)
  849.         AND     L
  850.        endif
  851. oldkeydd2=$+1
  852.        ld c,0xff
  853.        ld (oldkeydd2),a
  854.         CALL    Z,KEYDD2
  855.        if VIRTUALKEYS
  856.         ld a,(joy1state)
  857.         and JOYMASK_UP
  858.        else
  859.         LD      HL,(Keys1PlUp)          ;LD             HL,Keys1PlUp+2
  860.         LD      B,H                                     ;LD             BC,(Keys1PlUp)
  861.         LD      C,#FE                           ;CALL   CHBIT
  862.         IN      A,(C)
  863.         AND     L
  864.        endif
  865. oldkeyuu2=$+1
  866.        ld c,0xff
  867.        ld (oldkeyuu2),a
  868.         CALL    Z,KEYUU2
  869.         ret
  870.        
  871. STR8
  872. ;press start
  873.       if 1
  874.        cp c
  875.        ret z
  876.         call stopscroll_draw
  877.         jp CHEKSTA ;use menu option depending on Y (KORM2)
  878.       else
  879.         LD      A,(STAKEY) ;start unpressed?
  880.         CP      1
  881.         jp      Z,CHEKSTA ;use menu option depending on Y (KORM2)
  882.         LD      A,(STR6) ;time in startmenu
  883.         CP      220
  884.         JR      Z,STR10 ;wait start key unpress
  885.         LD      A,219
  886.         LD      (STR6),A ;??? time in startmenu
  887.        if 1==1
  888.         call stopscroll_draw
  889.         ;RET
  890.        else
  891.         LD      HL,#C000+26+8192+1024
  892.         LD      (STR2),HL ;scroll position in page?
  893.         LD      A,#10
  894.         LD      (STR),A ;scroll page?
  895.         CALL    CLSSTART ;???
  896.         RET
  897.        endif
  898. STR10
  899.       if 1==0
  900.        if VIRTUALKEYS
  901.         ld a,(joy1state)
  902.         and JOYMASK_START
  903.        else
  904.         LD      HL,(Keys1PlStart)
  905.         LD      B,H
  906.         LD      C,#FE
  907.         IN      A,(C)
  908.         AND     L
  909.        endif
  910.         JR      Z,STR10
  911.        if VIRTUALKEYS
  912.         ld a,(joy1state)
  913.         and JOYMASK_FIRE
  914.        else
  915.         LD      HL,(Keys1PlFr)
  916.         LD      B,H
  917.         LD      C,#FE
  918.         IN      A,(C)
  919.         AND     L
  920.        endif
  921.         JR      Z,STR10
  922.       endif
  923.         LD      A,1
  924.         LD      (STAKEY),A ;start unpressed
  925.         RET
  926.       endif
  927.  
  928. CHEKSTA
  929.         LD      HL,(KORM2) ;Y
  930.         LD      A,L
  931.         CP      126
  932.         JP      Z,FIGHT
  933.         CP      136
  934.         JP      Z,FIGHT
  935.         CP      146
  936.         JP      Z,EDITOR;START ;editor
  937.         CP      156
  938.         JP      Z,REDIFIN
  939.         RET
  940.  
  941. CLSSTART
  942.         if 1==1 ;???
  943.         call clstiles
  944.         else
  945.         LD      HL,25998
  946.         LD      A,%00010001
  947.         LD      (HL),A
  948.         INC     HL
  949.         LD      (HL),A
  950.         DEC     HL
  951.         LD      DE,#C000
  952.         LD      B,95 ;wid/8-1?
  953.         LD      C,240 ;hgt-1?
  954.         LD      A,#05
  955.         LD      (PAGEFR),A
  956.         LD      A,#10
  957.         LD      (PAGETO),A
  958.         LD      A,%00110100
  959.         CALL    DMASTART
  960.         HALT
  961.         HALT
  962.         endif
  963.         RET
  964.  
  965. STAKEY  DEFB    0 ;1=start unpressed
  966. STR     DEFB    #13 ;scroll page?
  967. STR2    DEFW    65535-228 ;scroll position in page?
  968. STR6    DEFB    0 ;time in startmenu
  969.  
  970. EXIT
  971.         LD      BC,#7FFE
  972.         IN      A,(C)
  973.         AND     %0000001
  974.         RET     NZ
  975.         LD      BC,#FEFE
  976.         IN      A,(C)
  977.         AND     %0000001
  978.         RET     NZ
  979.        halt
  980.        call setpgc3
  981.        CALL     #C000 ;init muzmain
  982.        call swapimer
  983.        QUIT
  984.         ;LD     A,31
  985.         ;LD     (MAP),A
  986.         ;RET
  987.  
  988. reter
  989.         ret
  990.  
  991. KERNF
  992.       ifdef CLIENT
  993.       if CLIENT
  994.        call sendjoyTMP
  995.       else
  996.        call readfrominet_tojoy2 ;может быть принято сколько угодно сообщений - берём последнее
  997.       endif
  998.       endif
  999.  
  1000.         call doscreen_and_logic
  1001.  
  1002. ;TODO эти события тоже обслуживать в logic:
  1003.         CALL    ENDGAME
  1004.         LD              A,(NEWLEVEL)
  1005.         CP              1
  1006.         CALL    Z,END5
  1007.  
  1008.         JR      KERNF
  1009.  
  1010. doscreen
  1011.         call showsprites
  1012. ;закончили рисовать
  1013.        ld a,(timer)
  1014.        push af
  1015.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  1016.        pop bc ;b=timer на момент changescrpg
  1017.        jp waitchangescr0
  1018.  
  1019. doscreen_and_logic
  1020. ;logic=56000..103000
  1021.         call showsprites
  1022. ;закончили рисовать
  1023.        ld a,(timer)
  1024.        push af
  1025.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  1026.  
  1027. ;логика
  1028. ;... её вызывать столько раз, сколько прошло прерываний!
  1029. mainloop_uvwaittimer0
  1030.         ld a,(timer)
  1031. uvoldtimer=$+1
  1032.         ld b,0
  1033.         ld (uvoldtimer),a
  1034.         sub b
  1035.         ld b,a
  1036.         jr z,mainloop_uvwaittimer0 ;если ни одного прерывания не прошло, крутимся тут
  1037.         cp 4
  1038.         jr c,$+4
  1039.         ld b,4
  1040. ;b=сколько прошло прерываний
  1041.       ifdef CLIENT
  1042.       if CLIENT
  1043.        ;call sendjoyTMP
  1044.        ld hl,logic
  1045.        call readfrominet_tojoy1joy2 ;читать одно сообщение, выполнить логику - и так пока есть сообщения
  1046.       else
  1047. mainloop_uvlogic0
  1048.         push bc
  1049.        ;call readfrominet_tojoy2 ;может быть принято сколько угодно сообщений - берём последнее
  1050.        call sendjoy1joy2 ;в каждом цикле логики
  1051.         call logic
  1052.         pop bc
  1053.         djnz mainloop_uvlogic0
  1054.       endif
  1055.       else
  1056. mainloop_uvlogic0
  1057.         push bc
  1058.         call logic
  1059.         pop bc
  1060.         djnz mainloop_uvlogic0
  1061.       endif
  1062.  
  1063.  
  1064. ;ждём физического переключения экрана!
  1065. ;можем начать новую отрисовку, только если с момента changescrpg прошло хотя бы одно прерывание (возможно, внутри logic)
  1066.        pop bc ;b=timer на момент changescrpg
  1067. waitchangescr0
  1068.         ld a,(timer)
  1069.         cp b
  1070.         jr z,waitchangescr0
  1071.         ret
  1072.  
  1073. ;pal
  1074.        include "pal.ast"
  1075.  
  1076. clearsprlist
  1077.         ld hl,sprlist
  1078.         ld de,sprlist+1
  1079.         ld bc,sprlistsz-1
  1080.         ld (hl),0
  1081.         ldir
  1082.         ret
  1083.  
  1084. clstiles
  1085.         ld hl,tilemap
  1086.         ld de,tilemap+1
  1087.         ld bc,BYTESPERTILELINE*30-1
  1088.         ld (hl),0
  1089.         ldir
  1090.         ld bc,TILEFLAG1*0x0101
  1091.        if TILES87
  1092.         ld hl,tilemap+0x800+BYTESPERTILELINE
  1093.        else
  1094.         ld hl,tilemap+0x800+(BYTESPERTILELINE*TOPYVISIBLE/8)
  1095.        endif
  1096.         call resettileflags
  1097.        if TILES87
  1098.         ld hl,tilemap+0x1000+BYTESPERTILELINE
  1099.        else
  1100.         ld hl,tilemap+0x1000+(BYTESPERTILELINE*TOPYVISIBLE/8)
  1101.        endif
  1102.         ;call resettileflags
  1103.         jp resettileflags
  1104.  
  1105. clstiles_field
  1106.         call clstiles
  1107.         ld hl,tilemap+34
  1108.         ld de,BYTESPERTILELINE-6
  1109.         ld bc,0x600+30 ;b=wid, c=hgt (chrs)
  1110. clstileblock0
  1111.         push bc
  1112.         ld (hl),0xe0
  1113.         inc hl
  1114.         djnz $-3
  1115.         pop bc
  1116.         add hl,de
  1117.         dec c
  1118.         jr nz,clstileblock0
  1119.         ret
  1120.  
  1121. clstiles_white
  1122.         call clstiles
  1123.         ld hl,tilemap
  1124.         ld de,BYTESPERTILELINE-40
  1125.         ld bc,40*256+30 ;b=wid, c=hgt (chrs)
  1126.         jr clstileblock0
  1127.  
  1128. prchar_tilemap_hl
  1129. ;a=char (kept)
  1130. ;hl=tilemap
  1131.         ;ex de,hl
  1132.         ;call prchar_tilemap
  1133.         ;ex de,hl
  1134.         PRCHAR_TILEMAP_HL
  1135.         ret
  1136. prchar_tilemap
  1137. ;a=char (kept)
  1138. ;de=tilemap
  1139.         ld (de),a
  1140.          if BYTESPERTILE == 2
  1141.          inc de
  1142.          ex de,hl
  1143.          ld (hl),0xc0 ;при печати тайла ставим биты изменения обоих экранов (а при печати спрайта надо только на текущем экране)
  1144.          ex de,hl
  1145.          dec de
  1146.          else
  1147.          ex de,hl
  1148.          set 3,h
  1149.          ld (hl),TILEFLAG1 ;при печати тайла ставим биты изменения обоих экранов (а при печати спрайта надо только на текущем экране)
  1150.          res 3,h
  1151.          set 4,h
  1152.          ld (hl),TILEFLAG1 ;при печати тайла ставим биты изменения обоих экранов (а при печати спрайта надо только на текущем экране)
  1153.          res 4,h
  1154.          ex de,hl
  1155.          endif
  1156.         ret
  1157.  
  1158.  
  1159. loadfile
  1160. ;de=filename
  1161. ;hl=addr
  1162.         push hl ;addr
  1163.         OS_OPENHANDLE
  1164.         pop de ;addr
  1165.         push bc ;b=handle
  1166.         ld hl,0x4000 ;max size
  1167.         OS_READHANDLE
  1168.         pop bc ;b=handle
  1169.         OS_CLOSEHANDLE
  1170.         ret
  1171.  
  1172. savefile
  1173. ;de=filename
  1174. ;hl=addr
  1175. ;bc=size
  1176.         push hl ;addr
  1177.         push bc ;size
  1178.         OS_CREATEHANDLE
  1179.         pop hl ;size
  1180.         pop de ;addr
  1181.         push bc ;b=handle
  1182.         OS_WRITEHANDLE
  1183.         pop bc ;b=handle
  1184.         OS_CLOSEHANDLE
  1185.         ret
  1186.  
  1187. bgfilename ;needs 40008000?
  1188.         db "menu.bmp",0
  1189.  
  1190.         macro PRTILE
  1191.        dup TILEHGT-1
  1192.         ld a,(de)
  1193.         inc d
  1194.         ld (hl),a
  1195.          set 6,h
  1196.         ld a,(de)
  1197.         inc d
  1198.         ld (hl),a
  1199.          set 5,h
  1200.         ld a,(de)
  1201.         inc d
  1202.         ld (hl),a
  1203.          res 6,h
  1204.         ld a,(de)
  1205.         inc d
  1206.         ld (hl),a
  1207.         add hl,bc
  1208.        edup
  1209.         ld a,(de)
  1210.         inc d
  1211.         ld (hl),a
  1212.          set 6,h
  1213.         ld a,(de)
  1214.         inc d
  1215.         ld (hl),a
  1216.          set 5,h
  1217.         ld a,(de)
  1218.         inc d
  1219.         ld (hl),a
  1220.          res 6,h
  1221.         ld a,(de)
  1222.         ld (hl),a  
  1223.         endm
  1224.  
  1225. drawlefttile
  1226.         ;jp drawleftandrighttiles
  1227.         ld hl,-2-0x800
  1228.         add hl,sp
  1229. ;de=screen line start
  1230.      push de
  1231.         res 3,h
  1232.          ld a,l
  1233.          and 0x3f
  1234.          add a,e
  1235.          ld e,a
  1236.          jr nc,$+3
  1237.           inc d
  1238.         ld l,(hl)
  1239.         ex de,hl
  1240.         ld d,0x60
  1241.         PRTILE
  1242.      pop de
  1243.         ret
  1244.  
  1245. drawrighttile
  1246.         ;jp drawleftandrighttiles
  1247.         ld hl,-2+1-0x800
  1248.         add hl,sp
  1249. ;de=screen line start
  1250.      push de
  1251.         res 3,h
  1252.          ld a,l
  1253.          and 0x3f
  1254.          add a,e
  1255.          ld e,a
  1256.          jr nc,$+3
  1257.           inc d
  1258.         ld l,(hl)
  1259.         ex de,hl
  1260.         ld d,0x60
  1261.         PRTILE
  1262.      pop de
  1263.         ret
  1264.  
  1265. drawleftandrighttiles
  1266.         ld hl,-2+1-0x800
  1267.         add hl,sp
  1268. ;de=screen line start
  1269.      push de
  1270.         res 3,h
  1271.         ld a,(hl) ;right tile
  1272.         ex af,af' ;'
  1273.         dec l
  1274.          ld a,l
  1275.          and 0x3f
  1276.          add a,e
  1277.          ld e,a
  1278.          jr nc,$+3
  1279.           inc d
  1280.         ld l,(hl) ;left tile
  1281.         ex de,hl
  1282.        push hl ;screen (even x)
  1283.         ld d,0x60
  1284.         PRTILE
  1285.        pop hl ;screen (even x)
  1286.        inc l ;screen (odd x)
  1287.         ex af,af' ;'
  1288.         ld e,a ;right tile
  1289.         ld d,0x60
  1290.         PRTILE
  1291.      pop de
  1292.         ret
  1293.  
  1294. nexttileliner
  1295.         ld hl,TILEHGT*40;-40
  1296.         add hl,de ;screen
  1297.         ex de,hl
  1298.         ld hl,BYTESPERTILELINE-40-2
  1299.         add hl,sp
  1300.         ld sp,hl
  1301.         ret
  1302.  
  1303. showtiles
  1304.         ld (showtilessp),sp
  1305. showtilesaddrpatch=$+1
  1306.        if TILES87
  1307.         ld sp,tilemap+0x800+BYTESPERTILELINE
  1308.        else
  1309.         ld sp,tilemap+0x800+(BYTESPERTILELINE*TOPYVISIBLE/8)
  1310.        endif
  1311.         ld de,0x8000
  1312.         ld bc,40-0x2000
  1313.        ret
  1314. ;если флаг отрисовки хранится отдельно (через set N,d), то:
  1315.         ;ret -> пропуск или рисование левого или правого или обоих тайлов
  1316. ;но тогда надо флаги для 0 и 1 экранов хранить в отдельных таблицах, т.к. они запарываются стеком. и после отрисовки залить текущую таблицу push'ами
  1317. endtileliner
  1318. showtilessp=$+1
  1319.         ld sp,0
  1320. ;сейчас при куче спрайтов
  1321. ;53000 + 8419(resettileflags)
  1322. ;TODO делать reset только там, где отрисовка, и по прерыванию (причём прерывание должно восстанавливать адрес nexttileliner)
  1323.         ret
  1324.  
  1325. resettileflags
  1326. ;hl=start of visible tiles
  1327.         ;ld bc,TILEFLAG0*0x0101
  1328. ;bc=TILEFLAG0*0x0101 or TILEFLAG1*0x0101
  1329.         ld (filltileflagsp),sp
  1330.        if TILES87
  1331.         ld de,28*64+40+2
  1332.         ld hx,29
  1333.        else
  1334.         ld de,24*64+40+2
  1335.         ld hx,25
  1336.        endif
  1337.         add hl,de
  1338.         ld de,endtileliner
  1339. filltileflagline0
  1340.         ld sp,hl
  1341.         push de
  1342.         dup 40/2
  1343.         push bc
  1344.         edup
  1345.         ld de,-BYTESPERTILELINE
  1346.         add hl,de
  1347.         ld de,nexttileliner
  1348.         dec hx
  1349.         jp nz,filltileflagline0
  1350. filltileflagsp=$+1
  1351.         ld sp,0
  1352.         ret
  1353.  
  1354. showsprites
  1355.         ld hl,tileaddrpatch+1
  1356.         ld a,(hl)
  1357.         xor 0x18
  1358.         ld (hl),a
  1359.         ld hl,showtilesaddrpatch+1
  1360.         ld a,(hl)
  1361.         xor 0x18
  1362.         ld (hl),a
  1363.        
  1364.         call setpgsscr8000c000
  1365.         call setpgc2_4000;setpggfxc000
  1366.         call showtiles
  1367.        
  1368.         ld hl,(showtilesaddrpatch)
  1369.         ld bc,TILEFLAG0*0x0101
  1370.          ;ld bc,TILEFLAG1*0x0101
  1371.         call resettileflags
  1372.        
  1373.         call setpgsscr40008000
  1374.        ;jp showsprites0q
  1375.         ld ix,sprlist
  1376.         ld b,85
  1377. showsprites0
  1378. ;+0: y
  1379. ;+1: 2(ysize:SPSIZ16) +0x20(SPACT) +0x40(deact) +0x80(mirrorvert) +1(SPSIZBS)
  1380. ;+2: x
  1381. ;+3: 2(xsize:SPSIZ16) +1(SPSIZBS) +0x80(mirrorhor)
  1382. ;+4,5: pattern number
  1383.         ld a,(ix+1)
  1384.         or a
  1385.         jp z,showsprites0skip
  1386.         bit 6,a
  1387.         jp nz,showsprites0skip
  1388.         ;jp nz,showsprites0q ;не видно бонус
  1389.         bit 5,a
  1390.         jp z,showsprites0skip
  1391. ;ix+1 bit7 = mirror vert
  1392. ;ix+3 bit7 = mirror hor
  1393.         rla
  1394.         ld a,(ix+3)
  1395.         rla
  1396.         rla
  1397.         and 3 ;%000000vh
  1398.         or 0xc0
  1399.         ld (prspr_type+1),a
  1400.        push bc
  1401.         ld a,(ix+4) ;sprite pattern ;00(up/down),04(left/right)
  1402.         ld (prspr_type),a
  1403.         bit 5,a
  1404.         jr nz,prspr_setpgright
  1405.        bit 0,(ix+5) ;+256
  1406.         call z,setpgc0 ;left sprites (tanks)
  1407.         call nz,setpgspr2
  1408.        bit 1,(ix+5) ;+512
  1409.         call nz,setpgspr3
  1410.         jp prspr_setpgq
  1411. prspr_setpgright
  1412.         call setpgc1 ;right sprites (bullets)
  1413. prspr_setpgq
  1414.        if TILES87
  1415.         ld c,(ix+0) ;y
  1416.         ld a,c
  1417.          add a,4+(2*8)
  1418.         rra
  1419.         rra
  1420.         rra
  1421.         and 0x1f ;*1/8
  1422.         cpl
  1423.         ;inc a
  1424.         add a,c ;*7/8 (округление такое: 0,1,2,3,3,4,5,6, 7,8,9,10,10,11,12,13...
  1425.          add a,sprmaxhgt-1 +2 -6;7
  1426.          cp 199+sprmaxhgt-1 ;защита от второго взрыва сверху с отрицательным y
  1427.          jp nc,showsprites0popbcskip
  1428.          sub sprmaxhgt-1;6;7
  1429.          ;sub 6;7
  1430.        else
  1431.         ld a,(ix+0) ;y
  1432.         add a,sprmaxhgt-1 -TOPYVISIBLE
  1433.          cp 199+sprmaxhgt-1 ;защита от второго взрыва сверху с отрицательным y
  1434.          jp nc,showsprites0popbcskip
  1435.          sub sprmaxhgt-1;6;7      
  1436.        endif
  1437.         ld c,a ;y
  1438.         ld a,(ix+3) ;xsize, xhsb
  1439.         rra
  1440.         ld a,(ix+2) ;x
  1441.         rra
  1442.         add a,sprmaxwid-1
  1443.         ld e,a
  1444. prspr_type=$+2
  1445.         ld iy,(0xc000)
  1446. ;e=x = -(sprmaxwid-1)..159 (кодируется как x/2+(sprmaxwid-1))
  1447. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1448.        push ix
  1449.        push de
  1450.          ld a,(iy-3) ;sprhgt
  1451.          cp 16
  1452.          jr nz,prspr_bighgt
  1453.         call prspr
  1454.        pop de
  1455.        pop ix
  1456.        ;ставим флаги обновления на тайлах под спрайтом
  1457.         ld c,(ix+0) ;y
  1458.        ld a,e ;x/2
  1459.        sub sprmaxwid-1
  1460.        jr nc,$+3
  1461.         xor a
  1462.        and 0xfc
  1463.        ld e,a ;x/2
  1464.        ld a,c ;y
  1465.        and 0xf8
  1466.         cp 8*29;30
  1467.         jr c,$+3
  1468.          xor a
  1469.        ld l,a
  1470.        ld h,0
  1471.        ld d,h;0
  1472.        add hl,hl
  1473.        add hl,hl
  1474.        add hl,hl ;Y*64
  1475.        if BYTESPERTILE == 2
  1476.         add hl,hl ;*128
  1477.        endif
  1478.        srl e
  1479.        if BYTESPERTILE == 1
  1480.        srl e
  1481.        endif
  1482.        add hl,de
  1483. tileaddrpatch=$+1
  1484.        ld de,tilemap+0x800
  1485.        add hl,de
  1486.         ld a,(ix+2) ;x
  1487.         and 7
  1488.        ld a,TILEFLAG1
  1489.        ld (hl),a
  1490.         jr z,prsprwid2
  1491.        dup BYTESPERTILE
  1492.        inc l
  1493.        edup
  1494.        ld (hl),a
  1495.        dup BYTESPERTILE
  1496.        inc l
  1497.        edup
  1498.        ld (hl),a
  1499.        ld de,BYTESPERTILELINE-(2*BYTESPERTILE)
  1500.        add hl,de
  1501.        ld (hl),a
  1502.        dup BYTESPERTILE
  1503.        inc l
  1504.        edup
  1505.        ld (hl),a
  1506.        dup BYTESPERTILE
  1507.        inc l
  1508.        edup
  1509.        ld (hl),a
  1510.        add hl,de
  1511.        ld (hl),a
  1512.        dup BYTESPERTILE
  1513.        inc l
  1514.        edup
  1515.        ld (hl),a
  1516.        dup BYTESPERTILE
  1517.        inc l
  1518.        edup
  1519.        ld (hl),a
  1520.       if TILES87
  1521. ;из-за тайлов высотой 7 при y=6 приходится обновить четыре ряда:
  1522.         ld a,c ;y
  1523.         cpl
  1524.         and 7
  1525.         jr nz,prsprhgt3q
  1526.         ld a,TILEFLAG1
  1527.        add hl,de
  1528.        ld (hl),a
  1529.        dup BYTESPERTILE
  1530.        inc l
  1531.        edup
  1532.        ld (hl),a
  1533.        dup BYTESPERTILE
  1534.        inc l
  1535.        edup
  1536.        ld (hl),a
  1537.       endif
  1538.        jp prsprhgt3q
  1539.  
  1540. prsprwid2
  1541.        dup BYTESPERTILE
  1542.        inc l
  1543.        edup
  1544.        ld (hl),a
  1545.        ld de,BYTESPERTILELINE-(1*BYTESPERTILE)
  1546.        add hl,de
  1547.        ld (hl),a
  1548.        dup BYTESPERTILE
  1549.        inc l
  1550.        edup
  1551.        ld (hl),a
  1552.        add hl,de
  1553.        ld (hl),a
  1554.        dup BYTESPERTILE
  1555.        inc l
  1556.        edup
  1557.        ld (hl),a
  1558.       if TILES87
  1559. ;из-за тайлов высотой 7 при y=6 приходится обновить четыре ряда:
  1560.         ld a,c ;y
  1561.         cpl
  1562.         and 7
  1563.         jr nz,prsprhgt3q
  1564.         ld a,TILEFLAG1
  1565.        add hl,de
  1566.        ld (hl),a
  1567.        dup BYTESPERTILE
  1568.        inc l
  1569.        edup
  1570.        ld (hl),a
  1571.       endif
  1572.        jp prsprhgt3q
  1573. prspr_bighgt
  1574.         call prspr
  1575.        pop de
  1576.        pop ix
  1577.      if 1==1
  1578.        ;ставим флаги обновления на тайлах под спрайтом
  1579.         ld c,(ix+0) ;y
  1580.        ld a,e ;x/2
  1581.        sub sprmaxwid-1
  1582.        jr nc,$+3
  1583.         xor a
  1584.        and 0xfc
  1585.        ld e,a ;x/2
  1586.        ld a,c ;y
  1587.        and 0xf8
  1588.        ld l,a
  1589.        ld h,0
  1590.        ld d,h;0
  1591.        add hl,hl
  1592.        add hl,hl
  1593.        add hl,hl ;Y*64
  1594.        if BYTESPERTILE == 2
  1595.         add hl,hl ;*128
  1596.        endif
  1597.        srl e
  1598.        if BYTESPERTILE == 1
  1599.        srl e
  1600.        endif
  1601.        add hl,de
  1602.        ld de,(tileaddrpatch)
  1603.        add hl,de
  1604.        ld de,BYTESPERTILELINE-(4*BYTESPERTILE)
  1605.       if TILES87
  1606.        ld b,6
  1607.       else
  1608.        ld b,5
  1609.       endif
  1610. prspr_bighgt1
  1611.        ld a,TILEFLAG1
  1612.        ld (hl),a
  1613.       dup 4
  1614.        dup BYTESPERTILE
  1615.        inc hl ;нельзя l, не компенсируется add
  1616.        edup
  1617.        ld (hl),a
  1618.       edup
  1619.       ld a,h
  1620.        add hl,de
  1621.       xor h
  1622.       and 0xf8 ;остаёмся в рамках одной карты флагов!
  1623.       xor h
  1624.       ld h,a
  1625.        djnz prspr_bighgt1
  1626.      endif
  1627.        jp prsprhgt3q
  1628. prsprhgt3q
  1629.  
  1630. ;если спрайт - танк (не бонус)
  1631. ;draw tree (one or many) above sprite if needed
  1632.        if TILES87 || !DRAWFOREST
  1633.        else
  1634.         bit 5,(ix+4)
  1635.         jp nz,prspr_tree_q ;не танк
  1636.         call setpgc1 ;right sprites (bullets)
  1637.         ld a,(ix+0) ;y
  1638.          and 0xf0
  1639.         ld l,a ;y for tilemap
  1640.         sub TOPYVISIBLE
  1641.         ;add a,sprmaxhgt-1 -TOPYVISIBLE
  1642.          ;cp 199+sprmaxhgt-1 ;защита от второго взрыва сверху с отрицательным y
  1643.          ;jp nc,showsprites0popbcskip
  1644.          ;sub sprmaxhgt-1;6;7      
  1645.         ld c,a ;y for prspr
  1646.         ld a,(ix+3) ;xsize, xhsb
  1647.         rra
  1648.         ld a,(ix+2) ;x
  1649.         rra
  1650.          and 0xf8
  1651.        ld e,a ;x/2 for tilemap
  1652.         add a,sprmaxwid-1
  1653.         ld b,a ;x/2 for prspr
  1654.        ;ld l,c ;y = Y*8
  1655.        ld h,0
  1656.        ld d,h;0
  1657.        add hl,hl
  1658.        add hl,hl
  1659.        add hl,hl ;Y*64
  1660.        srl e
  1661.        srl e ;x/8
  1662.        add hl,de
  1663.        ld de,tilemap;+(TOPYVISIBLE/8*BYTESPERTILELINE)
  1664.        add hl,de
  1665.        push bc
  1666.        push hl
  1667.        ld e,b ;x/2
  1668.        ld a,(hl)
  1669.        cp 24 ;tree
  1670.         ld iy,(0xc000+62)
  1671. ;e=x = -(sprmaxwid-1)..159 (кодируется как x/2+(sprmaxwid-1))
  1672. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1673.        push ix
  1674.         call z,prspr ;округление x влево, y вверх
  1675.        pop ix
  1676.        pop hl
  1677.        pop bc
  1678.        
  1679.         ld a,(ix+2) ;x
  1680.         and 0x0e
  1681.         jr z,prspr_tree_xrightq ;округлять x вправо не требуется
  1682.        push bc
  1683.        push hl
  1684.        inc l
  1685.        inc l
  1686.        ld a,b ;x/2
  1687.        add a,8
  1688.        ld e,a
  1689.        ld a,(hl)
  1690.        cp 24 ;tree
  1691.         ld iy,(0xc000+62)
  1692. ;e=x = -(sprmaxwid-1)..159 (кодируется как x/2+(sprmaxwid-1))
  1693. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1694.        push ix
  1695.         call z,prspr ;округление x влево, y вверх
  1696.        pop ix
  1697.        pop hl
  1698.        pop bc
  1699. prspr_tree_xrightq
  1700.        
  1701.         ld a,(ix+0) ;y
  1702.         and 0x0f
  1703.         jr z,prspr_tree_q ;округлять y вниз не требуется
  1704.        ld de,BYTESPERTILELINE*2
  1705.        add hl,de
  1706.        ld a,c
  1707.        add a,16
  1708.        ld c,a ;y
  1709.        push bc
  1710.        push hl
  1711.        ld e,b ;x/2
  1712.        ld a,(hl)
  1713.        cp 24 ;tree
  1714.         ld iy,(0xc000+62)
  1715. ;e=x = -(sprmaxwid-1)..159 (кодируется как x/2+(sprmaxwid-1))
  1716. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1717.        push ix
  1718.         call z,prspr ;округление x влево, y вверх
  1719.        pop ix
  1720.        pop hl
  1721.        pop bc
  1722.  
  1723.         ld a,(ix+2) ;x
  1724.         and 0x0e
  1725.         jr z,prspr_tree_q ;округлять x вправо не требуется
  1726.        inc l
  1727.        inc l
  1728.        ld a,b ;x/2
  1729.        add a,8
  1730.        ld e,a
  1731.        ld a,(hl)
  1732.        cp 24 ;tree
  1733.         ld iy,(0xc000+62)
  1734. ;e=x = -(sprmaxwid-1)..159 (кодируется как x/2+(sprmaxwid-1))
  1735. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1736.        push ix
  1737.         call z,prspr ;округление x влево, y вверх
  1738.        pop ix      
  1739. prspr_tree_q
  1740.        endif
  1741.        
  1742.        
  1743. showsprites0popbcskip
  1744.        pop bc
  1745. showsprites0skip
  1746.         ld de,6
  1747.         add ix,de
  1748.         dec b
  1749.         jp nz,showsprites0
  1750. showsprites0q
  1751. ;сейчас примерно 82000 при куче спрайтов
  1752.  
  1753.         call setpgsmain40008000
  1754.         ;call setpg8
  1755.         ;ret
  1756. setpg8 ;area?
  1757. pgarea=$+1
  1758.         ld a,0
  1759.         SETPGC000
  1760.         ret
  1761.  
  1762. border1
  1763.         xor a
  1764.         ld (curborder),a
  1765.         ;ld e,0;1
  1766.         ;OS_SETBORDER
  1767.         ret
  1768. border8
  1769.         ld a,12
  1770.         ld (curborder),a
  1771.         ;ld e,12
  1772.         ;OS_SETBORDER
  1773.         ret
  1774.  
  1775. setpgc ;ending music
  1776. pgmuzend=$+1
  1777.         ld a,0
  1778.         SETPGC000
  1779.         ret
  1780. setpg16 ;levels 01-16
  1781. pglvl0=$+1
  1782.         ld a,0
  1783.         SETPGC000
  1784.         ret
  1785. setpg17 ;levels 17-32
  1786. pglvl1=$+1
  1787.         ld a,0
  1788.         SETPGC000
  1789.         ret
  1790. setpg18 ;level 00 user
  1791. pglvl2=$+1
  1792.         ld a,0
  1793.         SETPGC000
  1794.         ret
  1795. setpgc0 ;spr0 ;left sprites (tanks)
  1796. pgspr0=$+1
  1797.         ld a,0
  1798.         SETPGC000
  1799.         ret
  1800. setpgc1 ;spr1 ;right sprites (bullets)
  1801. pgspr1=$+1
  1802.         ld a,0
  1803.         SETPGC000
  1804.         ret
  1805. setpgc2_4000
  1806.         ld a,(pgtiles)
  1807.         SETPG4000
  1808.         ret
  1809. setpgc2 ;tiles
  1810. pgtiles=$+1
  1811.         ld a,0
  1812.         SETPGC000
  1813.         ret
  1814. setpgc3 ;main music, boss music
  1815. pgmuzmain=$+1
  1816.         ld a,0
  1817.         SETPGC000
  1818.         ret
  1819. setpgspr2
  1820. pgspr2=$+1
  1821.         ld a,0
  1822.         SETPGC000
  1823.         ret
  1824. setpgspr3
  1825. pgspr3=$+1
  1826.         ld a,0
  1827.         SETPGC000
  1828.         ret
  1829. setpg
  1830. ;a=(SM1),(SM2) ;#10..#13???
  1831.        ret
  1832.         ;ld ($+4),a
  1833.         ;ld a,(tpgs)
  1834.          ld c,a
  1835.          ld b,tpgs/256
  1836.          ld a,(bc)
  1837.         SETPGC000
  1838.         ret
  1839.  
  1840.  
  1841. genpush_newpage
  1842. ;заказывает страницу, заносит в tpushpgs, a=pg
  1843.         push bc
  1844.         push de
  1845.         push hl
  1846.         push ix
  1847.         OS_NEWPAGE
  1848.         pop ix
  1849.         ld a,e
  1850.         ld (ix),a
  1851.         ld de,4
  1852.         add ix,de
  1853.         pop hl
  1854.         pop de
  1855.         pop bc
  1856.         ret
  1857.  
  1858.         INCLUDE "bgpush.asm"
  1859.         INCLUDE "../../_sdk/bmp.asm"
  1860.         include "../../_sdk/file.asm"
  1861. bgpush_bmpbuf=0x4000 ;ds 1024;320 ;заголовок bmp или одна строка
  1862. bgpush_loadbmplinestack=bgpush_bmpbuf+1024 ;ds pushhgt*2+32
  1863.  
  1864.         align 256
  1865. trecodebyteleft
  1866.         dup 256
  1867. ;%00003210 => %.3...210
  1868. _3=$&8
  1869. _210=$&7
  1870.         db (_3*0x08) + (_210*0x01)
  1871.         edup
  1872.        
  1873. trecodebyteright
  1874.         dup 256
  1875. ;%00003210 => %3.210...
  1876. _3=$&8
  1877. _210=$&7
  1878.         db (_3*0x10) + (_210*0x08)
  1879.         edup
  1880.  
  1881.         align 256
  1882. tpushpgs ;номера 0..15
  1883. tpgs ;номера 16..
  1884.         ds 256
  1885.         ;align 256
  1886.         ds TILEFLAG0*256+TILEFLAG0-$
  1887.         ret
  1888.         ds TILEFLAG0*256+TILEFLAG1-$
  1889.         jp drawlefttile
  1890.         ds TILEFLAG1*256+TILEFLAG0-$
  1891.         jp drawrighttile
  1892.         ds TILEFLAG1*256+TILEFLAG1-$
  1893.         jp drawleftandrighttiles
  1894.  
  1895.         INCLUDE "int.asm"
  1896.  
  1897.         ds 0x2000-$
  1898. tilemap
  1899.        if BYTESPERTILE == 1
  1900.         ds 64*32*BYTESPERTILE
  1901.         ds 64*32*BYTESPERTILE ;scr0 update flags
  1902.        endif
  1903.         ds 64*35*BYTESPERTILE ;scr1 update flags ;40*25 ;35 - запас на любой y при обновлении 4 рядов
  1904.  
  1905.         INCLUDE "mem.asm"
  1906.         INCLUDE "prspr.asm"
  1907.  
  1908.         ;display $,"<0x3ee0"
  1909.         ds 0x3ee0-$
  1910.         ds 0x4000-$
  1911.  
  1912.         INCLUDE "units.asm"
  1913.         INCLUDE "XASASM1.a80"
  1914.         INCLUDE "BC1.a80"
  1915.         INCLUDE "BC2.a80"
  1916.         INCLUDE "BC3.a80"
  1917.         INCLUDE "BC4.a80"
  1918.  
  1919. path
  1920.         db "zxbattle",0
  1921. fn_log
  1922.         db "zxbattle.log",0
  1923. fn_hiscore
  1924.         db "hi_score.dat",0
  1925. fn_soundfx
  1926.         db "sound_fx.bin",0
  1927. fn_muzmain
  1928.         db "muz_main.dat",0
  1929. fn_muzboss
  1930.         db "muz_boss.dat",0
  1931. fn_muzend
  1932.         db "muz_end.dat",0
  1933.         if TILES87
  1934. fn_lvl0116
  1935.         db "lvl_0116.dat",0
  1936. fn_lvl1732
  1937.         db "lvl_1732.dat",0
  1938.         else
  1939. fn_lvl0116
  1940.         db "lvln0116.dat",0
  1941. fn_lvl1732
  1942.         db "lvln1732.dat",0
  1943.         endif
  1944. fn_lvl00us
  1945.         db "lvl_00us.dat",0
  1946. fn_spr0
  1947.         db "spr0.dat",0
  1948. fn_spr1
  1949.         db "spr1.dat",0
  1950. fn_spr2
  1951.         db "spr2.dat",0
  1952. fn_spr3
  1953.         db "spr3.dat",0
  1954. fn_tiles
  1955.         db "font.bin",0
  1956.  
  1957.        ifdef CLIENT
  1958. inetbuf_sz=256
  1959. inetbuf
  1960.         ds inetbuf_sz
  1961.        endif
  1962.  
  1963. end
  1964.  
  1965.         display "End=",end
  1966.         ;display "Free after end=",/d,#c000-end
  1967.         ;display "Size ",/d,end-begin," bytes"
  1968.         display "UP1=",UP1
  1969.         display "MAP=",MAP
  1970.  
  1971.        ifdef CLIENT
  1972.         if CLIENT
  1973.                 savebin "zxbatcli.com",begin,end-begin
  1974.         else
  1975.                 savebin "zxbatsrv.com",begin,end-begin
  1976.         endif
  1977.        else
  1978.         savebin "zxbattle.com",begin,end-begin
  1979.        endif
  1980.  
  1981.         LABELSLIST "../../../us/user.l"
  1982.