?login_element?

Subversion Repositories NedoOS

Rev

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