?login_element?

Subversion Repositories NedoOS

Rev

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

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