Subversion Repositories NedoOS

Rev

Rev 1187 | Rev 1193 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

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