Subversion Repositories NedoOS

Rev

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

  1.             DEVICE ZXSPECTRUM1024
  2. MANYLIVES=0;1 ;убрать при релизе!!!
  3. TILES87=0;1
  4. TILEHGT=8-TILES87
  5.             DEFINE  ProjName        ZXBattleCity
  6.             DEFINE  ProjVer         1_5
  7.             ;DEFINE  TRDName         "ZXBattleCity_1_5.trd"
  8.             ;DEFINE  BasicFName      "boot.B"
  9.             ;DEFINE  MainCodeFName   "city.C"
  10.             ;DEFINE  MainCodeStart   #6590   ;26000
  11.  
  12.             ;EMPTYTRD TRDName
  13.         include "../../_sdk/sys_h.asm"
  14.  
  15. TOPYLOAD=32;0
  16. TOPY=0;32
  17. TOPYVISIBLE=TOPY+8
  18.         if TILES87
  19. MAXY=(30-2)*8;224
  20.         else
  21. MAXY=(26-2)*8
  22.         endif
  23.  
  24. scrbase=0x4000
  25. sprmaxwid=32
  26. sprmaxhgt=32
  27. scrwid=160 ;double pixels
  28. scrhgt=200
  29.  
  30. pushbase=0x8000
  31.         macro SETPGPUSHBASE
  32.         SETPG32KLOW
  33.         endm
  34.  
  35.         macro RECODEBYTE
  36.         ld a,(de)
  37.         ld ($+4),a
  38.         ld a,(trecodebyteright)
  39.         ld c,a
  40.         dec de
  41.         ld a,(de)
  42.         dec de
  43.         ld ($+4),a
  44.         ld a,(trecodebyteleft)
  45.         or c
  46.         endm        
  47.  
  48. STACK=0x3ff0
  49. tempsp=0x3f06 ;6 bytes for prspr
  50. INTSTACK=0x3f00
  51.  
  52. ;TILEFLAGBIT=2
  53. TILEFLAG0=0x18
  54. TILEFLAG1=0x1c
  55.  
  56. WATERANIMTILE=102
  57. NWATERANIMTILES=2
  58.  
  59. SPSIZ16=2
  60. SPACT=32
  61. SPSIZ8=0
  62.  
  63. SPRDROP=256+34
  64. SPRBULLETUP=52
  65. SPRBULLETRIGHT=54
  66.  
  67. SPRCLOUD0=256+44
  68. SPRCLOUD1=256+46
  69.  
  70. ;сейчас спрайты лежат так (реально есть только чётные номера):
  71. ;0..31,64..95,... (my tank level 0,1, enemy1) в spr0 (+256 - mirror hrz, +512 - mirror vert)
  72. ;32..63,96..127,... в spr1 (+256 - mirror hrz, +512 - mirror vert)
  73. ;TODO:
  74. ;256+ (my tank level 2 (+16),3 (+128+16), enemy2 (+0)) в spr2
  75. ;512+ (enemy 3 (+0),4 (+64),5 (+128)) в spr3
  76.  
  77. SPRMYTANKLEVEL0=0
  78. SPRMYTANKLEVEL1=16
  79. SPRMYTANKLEVEL2=256+16
  80. SPRMYTANKLEVEL3=256+128+16
  81.  
  82. ;my tank level 0,1,2,3 - sprite 0,16,256+16,256+128+16
  83. ;enemy tank sprites (add 8 for red version):
  84. ;SPRENEMY1=0+8;256+128
  85. ;SPRENEMY2=0+16;256+128+128
  86. ;SPRENEMY3=0+24;256+128+128+128
  87. ;SPRENEMY4=64+0;256+128+256+128
  88. ;SPRENEMY5=64+8;256+128+256+256
  89. SPRENEMY1=0+64;256+128
  90. SPRENEMY2=256;256+128+128
  91. SPRENEMY3=512;256+128+128+128
  92. SPRENEMY4=512+64;256+128+256+128
  93. SPRENEMY5=512+128;256+128+256+256
  94.  
  95. SPRMEGASHIP=32;256+36
  96.  
  97. SPRBONUS0=96;80;256+128+16
  98. SPRBONUS1=98;82;256+128+18
  99. SPRBONUS2=100;84;256+128+20
  100. SPRBONUS3=102;86;256+128+22
  101. SPRBONUS4=104;88;256+128+24
  102. SPRBONUS5=106;90;256+128+26
  103. SPRBONUS6=108;92;256+128+28
  104. SPRBONUS7=110;94;256+128+30
  105. SPRBONUS8=112;192+32;256+128+32
  106.  
  107. SPRSTAR0=120;256+48
  108. SPRSTAR1=122;256+50
  109. SPRSTAR2=124;256+52
  110. SPRSTAR3=126;256+54
  111.  
  112. SPRENE0=128+64+46;256+128+46
  113. SPRENE1=128+64+48;256+128+48
  114. SPRENE2=128+64+50;256+128+50
  115. SPRENE3=128+64+52;256+128+52
  116. SPRENE4=128+64+54;256+128+54
  117.  
  118. SPRBOOM0=56
  119. SPRBOOM1=58
  120. SPRBOOM2=60
  121. SPRBOOM0_=48;256+56 ;big boom
  122. SPRBOOM2_=50;256+60
  123.  
  124. SPRGAMEOVER0=256+40
  125. SPRGAMEOVER1=256+42
  126.  
  127. BYTESPERTILE=1;2
  128. BYTESPERTILELINE=(BYTESPERTILE*64);256
  129.  
  130.         macro PRCHAR_TILEMAP_HL
  131.         ld (hl),a
  132.          set 3,h
  133.          ld (hl),TILEFLAG1 ;при печати тайла ставим биты изменения обоих экранов (а при печати спрайта надо только на текущем экране)
  134.          res 3,h
  135.          set 4,h
  136.          ld (hl),TILEFLAG1 ;при печати тайла ставим биты изменения обоих экранов (а при печати спрайта надо только на текущем экране)
  137.          res 4,h
  138.         endm
  139.  
  140.         macro TILEMAPLINEUP
  141.         ;LD     BC,-256
  142.         LD      BC,-BYTESPERTILELINE;-256
  143.         ADD     HL,BC
  144.         endm
  145.  
  146.         macro TILEMAPLINEDOWN
  147.         ;LD     BC,256
  148.         LD      BC,BYTESPERTILELINE;256
  149.         ADD     HL,BC
  150.         endm
  151.  
  152.         macro TILEMAPLEFTLINEDOWN
  153.         ;LD     BC,256-2
  154.         LD      BC,BYTESPERTILELINE-BYTESPERTILE;256-2
  155.         ADD     HL,BC
  156.         endm
  157.  
  158.         macro TILEMAPLEFT
  159.         dup BYTESPERTILE
  160.         dec hl
  161.         edup
  162.         ;dec hl
  163.         endm
  164.  
  165.         macro TILEMAPRIGHT
  166.         dup BYTESPERTILE
  167.         inc hl
  168.         edup
  169.         ;inc hl
  170.         endm
  171.  
  172.         org PROGSTART
  173. begin
  174.         jp MAINGO ;patched by prspr
  175. MAINGO
  176.         ld sp,STACK
  177.         ;OS_HIDEFROMPARENT
  178.         ld e,0 ;EGA
  179.         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
  180.         ld de,path
  181.         OS_CHDIR
  182.          ld e,1
  183.          OS_SETSCREEN
  184.          ld e,0
  185.          OS_CLS
  186.          ld e,0
  187.          OS_SETSCREEN
  188.          ld e,0
  189.          OS_CLS
  190.  
  191.         OS_GETMAINPAGES
  192. ;dehl=номера страниц в 0000,4000,8000,c000
  193.         ld a,e
  194.         LD (pgmain4000),A
  195.         ld a,h
  196.         LD (pgmain8000),A
  197.         ld a,l
  198.         LD (pgmainc000),A
  199.  
  200.         OS_NEWPAGE
  201.         ld a,e
  202.         ld (pgmuzmain),a
  203.         OS_NEWPAGE
  204.         ld a,e
  205.         ld (pgmuzend),a
  206.         OS_NEWPAGE
  207.         ld a,e
  208.         ld (pgspr0),a
  209.         OS_NEWPAGE
  210.         ld a,e
  211.         ld (pgspr1),a
  212.         OS_NEWPAGE
  213.         ld a,e
  214.         ld (pgspr2),a
  215.         OS_NEWPAGE
  216.         ld a,e
  217.         ld (pgspr3),a
  218.         OS_NEWPAGE
  219.         ld a,e
  220.         ld (pgtiles),a
  221.         OS_NEWPAGE
  222.         ld a,e
  223.         ld (pglvl0),a
  224.         OS_NEWPAGE
  225.         ld a,e
  226.         ld (pglvl1),a
  227.         OS_NEWPAGE
  228.         ld a,e
  229.         ld (pglvl2),a
  230.         OS_NEWPAGE
  231.         ld a,e
  232.         ld (pgarea),a
  233.  
  234.         CALL    INSREADY                                ;Loading Hi-Score table, music, palette, sound FX and palette initiallisation
  235.         LD      HL,48000                                ;Sound FX initiallisation
  236.         CALL    AFXINIT
  237.        
  238.         ld hl,prsprqwid
  239.         ld (0x0101),hl ;спрайты в файле подготовлены так, что выходят в 0x0100
  240.  
  241.         JP      PRESTARTS
  242.        
  243.         ds 0x200-$
  244. sprlist
  245.         ds 85*6
  246. sprlistsz=$-sprlist
  247. ;+0: y
  248. ;+1: 2(ysize:SPSIZ16) +0x20(SPACT) +0x40(deact) +0x80(mirrorvert) +1(SPSIZBS)
  249. ;+2: x
  250. ;+3: 2(xsize:SPSIZ16) +1(SPSIZBS) +0x80(mirrorhor)
  251. ;+4,5: pattern number
  252.  
  253. PRESTARTS
  254.         LD      A,(ENN) ;resources loaded?
  255.         CP      1
  256.         JP      Z,ZZZZ2 ;skip load
  257.                         ;LD             BC,PAGE3        ;CHANGE MEMORY FOR SPRITES
  258.                         ;LD             A,#C0
  259.                         ;OUT            (C),A
  260.         call setpgc0
  261.                         ;LD             DE,(DiskAddrImages)     ;Load sectors   Image.tg.p
  262.                         ;TRDReadFromDE  #C000,#40
  263.         ld de,fn_spr0
  264.         ld hl,0xc000
  265.         call loadfile
  266.                         ;LD             BC,PAGE3        ;CHANGE MEMORY FOR SPRITES
  267.                         ;LD             A,#C1
  268.                         ;OUT            (C),A
  269.         call setpgc1
  270.                         ;TRDReadFromHere #C000,#40      ;Load sectors   Image2.t.p
  271.         ld de,fn_spr1
  272.         ld hl,0xc000
  273.         call loadfile
  274.        
  275.         call setpgspr2
  276.         ld de,fn_spr2
  277.         ld hl,0xc000
  278.         call loadfile
  279.        
  280.         call setpgspr3
  281.         ld de,fn_spr3
  282.         ld hl,0xc000
  283.         call loadfile
  284.        
  285.                         ;LD             BC,PAGE3        ;CHANGE MEMORY FOR SPRITES
  286.                         ;LD             A,#C2
  287.                         ;OUT            (C),A
  288.         call setpgc2
  289.                         ;TRDReadFromHere #C000,#40      ;Load sectors   DATA0.C
  290.         ld de,fn_tiles
  291.         ld hl,0xc000
  292.         call loadfile
  293.         ld ix,0xc000
  294.         ld e,0
  295. ;recode tiles
  296. ;каждый символ храним по inc d, по 4 байта на строку в порядке 0,1,3,2
  297. ;то есть данные берём из +0,+8,+24,+16
  298. recodefont0
  299.         ld d,0xe0
  300.        
  301.         ld b,8
  302. recodefont1
  303.         ld a,(ix)
  304.         ld (de),a
  305.         inc d
  306.         ld a,(ix+8)
  307.         ld (de),a
  308.         inc d
  309.         ld a,(ix+24)
  310.         ld (de),a
  311.         inc d
  312.         ld a,(ix+16)
  313.         ld (de),a
  314.         inc d
  315.         inc ix
  316.         djnz recodefont1
  317.        
  318.         ld bc,32-8
  319.         add ix,bc
  320.        
  321.         inc e
  322.         jr nz,recodefont0
  323.                         ;LD      HL,(#5CF4)                             ;Save position of Levels on disk
  324.                         ;LD             (DiskAddrLevels),HL
  325.  
  326. ;vertical scroll
  327.         call setpgsscr40008000
  328.         ld de,bgfilename
  329.         call bgpush_prepare
  330.         call setpgsmain40008000
  331.  
  332.         call swapimer      
  333.  
  334. STARTS
  335.          LD A,1
  336.          LD (NEWLEVEL),A ;иначе рычит в меню
  337.          ld a,5
  338.          ld (SOUNDGO),a ;иначе остаток от рычания после гамовера?
  339.          call afxinit
  340.         LD      HL,BONUS2
  341.         LD      DE,BONUS
  342.         LD      BC,96
  343.         LDIR
  344.         ;LD     BC,PAGE3
  345.         ;LD     A,#C3
  346.         ;OUT    (C),A
  347.         call setpgc3
  348.         CALL    #C000 ;init muzmain
  349.         CALL    #CBB8 ;init muzboss
  350.         LD      A,200+24
  351.         LD      (SOUNDW),A ;time until music stops
  352.         CALL    POINTHI ;формирует в TEXT4 строку со счётом
  353.         XOR     A
  354.         LD      (NEWTAN1),A
  355.         LD      (NEWTAN2),A
  356.         LD      A,(MAP)
  357.         CP      255
  358.         JR      Z,FGF2
  359.         XOR     A ;first level
  360.          ;ld a,31 ;18"19" и 23"24" трудные
  361.         LD      (MAP),A
  362. FGF2
  363.  
  364. ZZZZ2
  365.         ;ld ix,UNITS
  366.         ;ld (ix+UNIT_YESORNOT),0
  367.          ;xor a
  368.          ;ld (sprlist+1),a ;disable sprite #0
  369.          call clearsprlist
  370.          call clstiles
  371.  
  372.         ;LD     BC,VCONFIG; CHANGE VIDEO RESOLUCION 1
  373.         ;LD     A,VID321X+1
  374.         ;OUT    (C),A
  375.         ;LD     BC,VPAGE; VRAM CHANGE
  376.         ;LD     A,#10
  377.         ;OUT    (C),A
  378.         ;LD     BC,BORDER
  379.         ;LD     A,1
  380.         ;OUT    (C),A
  381.         call border1
  382.         CALL    CLSSTART ;???
  383.         LD      A,2
  384.         LD      (FIGH),A ;какой-то признак deact спрайтов??? (потом не обнуляется!)
  385.  
  386.         ld hl,108
  387.         ld (callpush_curscroll),hl
  388.  
  389. ;Main menu cycle!
  390. ;K inject here! to-do
  391.          call doscreen
  392.          call doscreen
  393.          ;ld b,24
  394.          ;halt
  395.          ;djnz $-1
  396.        ld a,(timer)
  397.        ld (KERNSoldtimer),a
  398. ;цикл показа и обработки меню
  399. KERNS
  400.          ;jp EDITOR;START ;editor
  401.          ;jp FIGHT
  402.         CALL    EXIT ;if break, set (MAP)=31
  403.         LD      HL,(Keys1PlStart)
  404.         LD      B,H
  405.         LD      C,#FE
  406.         IN      A,(C)
  407.         AND     L
  408.         CALL    Z,STR8 ;press start
  409.         LD      HL,(Keys1PlFr)
  410.         LD      B,H
  411.         LD      C,#FE
  412.         IN      A,(C)
  413.         AND     L
  414.         CALL    Z,STR8 ;press start
  415.  
  416.         LD      A,(STR6) ;time in startmenu
  417.         CP      218
  418.         CALL    Z,STR77 ;autounpress start
  419.         CP      219
  420.         CALL    Z,STR7 ;print text TEXT3 (copyrights), TEXT4 (hiscores)
  421.         CP      220
  422.         JP      Z,STR4
  423.        if 1==1
  424.         ld a,(timer)
  425. KERNSoldtimer=$+1
  426.         ld b,0
  427.         ld (KERNSoldtimer),a
  428.         sub b
  429.         ld c,a
  430.         ld b,0
  431.         jr z,STR44
  432.        ld a,(STR6)
  433.        add a,c
  434.        ld (STR6),a
  435.         ld hl,(callpush_curscroll)
  436.         bit 7,h
  437.         jr nz,STR4 ;end of scroll
  438.         ld de,512-200-8
  439.         or a
  440.         sbc hl,de
  441.         jr nc,stopscroll
  442.         call bgpush_inccurscroll
  443. scroll_wait0
  444.        ld a,(timer)
  445. lastscrtimer=$+1
  446.        cp 0
  447.        jr z,scroll_wait0 ;wait screen change
  448.         call bgpush_draw ;359975t
  449.         call setpgsmain40008000
  450.        ld a,(timer)
  451.        ld (lastscrtimer),a
  452.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  453.         jp STR44
  454. stopscroll
  455.         call stopscroll_draw
  456. STR5
  457. STR44
  458.        else
  459.         INC     A
  460.         LD      (STR6),A ;++time in startmenu
  461.         LD      A,(STR) ;scroll page?
  462.         CP      15
  463.         JP      Z,STR4 ;end of scroll?
  464.         LD      HL,(STR2) ;scroll position?
  465.         LD      A,H
  466.         CP      #C0
  467.         JP      Z,STR3 ;go to previous scroll page
  468.         LD      DE,256
  469.         SBC     HL,DE
  470. STR5    LD      (STR2),HL ;scroll position?
  471.        if 1==0
  472.         PUSH    HL
  473.         POP     DE
  474.         LD      HL,#C000
  475.         LD      B,51 ;wid/8-1?
  476.         LD      C,154 ;hgt-1?
  477.         LD      A,#C2
  478.         LD      (PAGEFR),A
  479.         LD      A,(STR)
  480.         LD      (PAGETO),A
  481.         LD      A,%00010001
  482.         CALL    DMASTART
  483.        endif
  484. STR44
  485.        endif
  486.         ;HALT
  487.         ;call doscreen
  488.        ;call setpgc3
  489.        ;call #C000 ;init muzmain
  490.        ld a,(SOUNDW)
  491.        or a
  492.        call z,afxinit ;stop sound
  493.         jp KERNS
  494.  
  495. stopscroll_draw
  496.         ld de,512-200-8
  497.         ld (callpush_curscroll),de
  498.         call bgpush_draw ;359975t
  499.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  500.         halt
  501.         call bgpush_draw ;359975t
  502.         call setpgsmain40008000
  503.         ld h,-1
  504.         ld (callpush_curscroll),hl
  505.         ret
  506.        
  507. STR4
  508.          call doscreen
  509.         LD      HL,(Keys1PlDn)          ;LD             HL,Keys1PlDn+2
  510.         LD      B,H                                     ;LD             BC,(Keys1PlDn)
  511.         LD      C,#FE                           ;CALL   CHBIT
  512.         IN      A,(C)
  513.         AND     L
  514.         CALL    Z,KEYDD2
  515.         LD      HL,(Keys1PlUp)          ;LD             HL,Keys1PlUp+2
  516.         LD      B,H                                     ;LD             BC,(Keys1PlUp)
  517.         LD      C,#FE                           ;CALL   CHBIT
  518.         IN      A,(C)
  519.         AND     L
  520.         CALL    Z,KEYUU2
  521.         LD      HL,(KORM);---X
  522.         LD      BC,(KORM2);----Y
  523.        if TILES87
  524.        else
  525.         ld a,c
  526.         sub 16 ;костыль
  527.         ld c,a
  528.        endif
  529.         LD      A,(TANK) ;sprite phase
  530.         ADD     A,4;44 ;sprite pattern number
  531.         LD      D,2 ;size
  532.         CALL    PRINT
  533.         LD      A,(TANKP) ;anim timer
  534.         INC     A
  535.         CP      4
  536.         CALL    Z,TANKP2 ;next sprite phase
  537.         CP      8
  538.         CALL    Z,TANKP3 ;prev sprite phase
  539.         LD      (TANKP),A ;anim timer
  540.         ;LD     BC,TSCONFIG; SPRITE PRINT
  541.         ;LD     A,%10000000
  542.         ;OUT    (C),A
  543.         JP      STR44
  544.  
  545.         if 1==1
  546. STR3
  547.         LD      A,(STR)
  548.         DEC     A
  549.         LD      (STR),A ;--scroll page?
  550.         LD      HL,65535-228
  551.         LD      (STR2),HL ;scroll position?
  552.         JP      STR5
  553.         endif
  554.  
  555. STR77
  556.         PUSH    AF
  557.         LD      A,1 ;start unpressed
  558.         LD      (STAKEY),A
  559.         POP     AF
  560.         RET
  561.  
  562. CHEKSTA
  563.         LD      HL,(KORM2) ;Y
  564.         LD      A,L
  565.         CP      126
  566.         JP      Z,FIGHT
  567.         CP      136
  568.         JP      Z,FIGHT
  569.         CP      146
  570.         JP      Z,EDITOR;START ;editor
  571.         CP      156
  572.         JP      Z,REDIFIN
  573.         RET
  574.  
  575. STR8
  576. ;press start
  577.         LD      A,(STAKEY) ;start unpressed?
  578.         CP      1
  579.         jr      Z,CHEKSTA ;use menu option depending on Y (KORM2)
  580.         LD      A,(STR6) ;time in startmenu
  581.         CP      220
  582.         JR      Z,STR10 ;wait start key unpress
  583.         LD      A,219
  584.         LD      (STR6),A ;??? time in startmenu
  585.        if 1==1
  586.         call stopscroll_draw
  587.         ;RET
  588.        else
  589.         LD      HL,#C000+26+8192+1024
  590.         LD      (STR2),HL ;scroll position in page?
  591.         LD      A,#10
  592.         LD      (STR),A ;scroll page?
  593.         CALL    CLSSTART ;???
  594.         RET
  595.        endif
  596. STR10
  597.         LD      HL,(Keys1PlStart)
  598.         LD      B,H
  599.         LD      C,#FE
  600.         IN      A,(C)
  601.         AND     L
  602.         JR      Z,STR10
  603.         LD      HL,(Keys1PlFr)
  604.         LD      B,H
  605.         LD      C,#FE
  606.         IN      A,(C)
  607.         AND     L
  608.         JR      Z,STR10
  609.         LD      A,1
  610.         LD      (STAKEY),A ;start unpressed
  611.         RET
  612.  
  613. STAKEY  DEFB    0 ;1=start unpressed
  614. STR     DEFB    #13 ;scroll page?
  615. STR2    DEFW    65535-228 ;scroll position in page?
  616. STR6    DEFB    0 ;time in startmenu
  617.  
  618. EXIT
  619.         LD      BC,#7FFE
  620.         IN      A,(C)
  621.         AND     %0000001
  622.         RET     NZ
  623.         LD      BC,#FEFE
  624.         IN      A,(C)
  625.         AND     %0000001
  626.         RET     NZ
  627.        halt
  628.        call setpgc3
  629.        CALL     #C000 ;init muzmain
  630.        call swapimer
  631.        QUIT
  632.         ;LD     A,31
  633.         ;LD     (MAP),A
  634.         ;RET
  635.  
  636. KERNF
  637.         call doscreen_and_logic
  638.  
  639.         CALL    ENDGAME
  640.         LD              A,(NEWLEVEL)
  641.         CP              1
  642.         CALL    Z,END5
  643.         JR      KERNF
  644.  
  645. doscreen
  646.         call showsprites
  647. ;закончили рисовать
  648.        ld a,(timer)
  649.        push af
  650.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  651.        pop bc ;b=timer на момент changescrpg
  652.        jp waitchangescr0
  653.  
  654. doscreen_and_logic
  655. ;logic=56000..103000
  656.         call showsprites
  657. ;закончили рисовать
  658.        ld a,(timer)
  659.        push af
  660.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  661.  
  662. ;логика
  663. ;... её вызывать столько раз, сколько прошло прерываний!
  664. mainloop_uvwaittimer0
  665.         ld a,(timer)
  666. uvoldtimer=$+1
  667.         ld b,0
  668.         ld (uvoldtimer),a
  669.         sub b
  670.         ld b,a
  671.         jr z,mainloop_uvwaittimer0 ;если ни одного прерывания не прошло, крутимся тут
  672.         cp 4
  673.         jr c,$+4
  674.         ld b,4
  675. ;b=сколько прошло прерываний
  676. mainloop_uvlogic0
  677.         push bc
  678.         call logic ;<----------------- свою логику пиши сюда
  679.         pop bc
  680.         djnz mainloop_uvlogic0
  681.  
  682. ;ждём физического переключения экрана!
  683. ;можем начать новую отрисовку, только если с момента changescrpg прошло хотя бы одно прерывание (возможно, внутри logic)
  684.        pop bc ;b=timer на момент changescrpg
  685. waitchangescr0
  686.         ld a,(timer)
  687.         cp b
  688.         jr z,waitchangescr0
  689.         ret
  690.  
  691. ;pal
  692.        include "pal.ast"
  693.  
  694. clearsprlist
  695.         ld hl,sprlist
  696.         ld de,sprlist+1
  697.         ld bc,sprlistsz-1
  698.         ld (hl),0
  699.         ldir
  700.         ret
  701.  
  702. clstiles
  703.         ld hl,tilemap
  704.         ld de,tilemap+1
  705.         ld bc,BYTESPERTILELINE*30-1
  706.         ld (hl),0
  707.         ldir
  708.         ld bc,TILEFLAG1*0x0101
  709.        if TILES87
  710.         ld hl,tilemap+0x800+BYTESPERTILELINE
  711.        else
  712.         ld hl,tilemap+0x800+(BYTESPERTILELINE*TOPYVISIBLE/8)
  713.        endif
  714.         call resettileflags
  715.        if TILES87
  716.         ld hl,tilemap+0x1000+BYTESPERTILELINE
  717.        else
  718.         ld hl,tilemap+0x1000+(BYTESPERTILELINE*TOPYVISIBLE/8)
  719.        endif
  720.         ;call resettileflags
  721.         jp resettileflags
  722.  
  723. clstiles_field
  724.         call clstiles
  725.         ld hl,tilemap+34
  726.         ld de,BYTESPERTILELINE-6
  727.         ld bc,0x600+30 ;b=wid, c=hgt (chrs)
  728. clstileblock0
  729.         push bc
  730.         ld (hl),0xe0
  731.         inc hl
  732.         djnz $-3
  733.         pop bc
  734.         add hl,de
  735.         dec c
  736.         jr nz,clstileblock0
  737.         ret
  738.  
  739. clstiles_white
  740.         call clstiles
  741.         ld hl,tilemap
  742.         ld de,BYTESPERTILELINE-40
  743.         ld bc,40*256+30 ;b=wid, c=hgt (chrs)
  744.         jr clstileblock0
  745.  
  746. prchar_tilemap_hl
  747. ;a=char (kept)
  748. ;hl=tilemap
  749.         ;ex de,hl
  750.         ;call prchar_tilemap
  751.         ;ex de,hl
  752.         PRCHAR_TILEMAP_HL
  753.         ret
  754. prchar_tilemap
  755. ;a=char (kept)
  756. ;de=tilemap
  757.         ld (de),a
  758.          if BYTESPERTILE == 2
  759.          inc de
  760.          ex de,hl
  761.          ld (hl),0xc0 ;при печати тайла ставим биты изменения обоих экранов (а при печати спрайта надо только на текущем экране)
  762.          ex de,hl
  763.          dec de
  764.          else
  765.          ex de,hl
  766.          set 3,h
  767.          ld (hl),TILEFLAG1 ;при печати тайла ставим биты изменения обоих экранов (а при печати спрайта надо только на текущем экране)
  768.          res 3,h
  769.          set 4,h
  770.          ld (hl),TILEFLAG1 ;при печати тайла ставим биты изменения обоих экранов (а при печати спрайта надо только на текущем экране)
  771.          res 4,h
  772.          ex de,hl
  773.          endif
  774.         ret
  775.  
  776.  
  777. loadfile
  778. ;de=filename
  779. ;hl=addr
  780.         push hl ;addr
  781.         OS_OPENHANDLE
  782.         pop de ;addr
  783.         push bc ;b=handle
  784.         ld hl,0x4000 ;max size
  785.         OS_READHANDLE
  786.         pop bc ;b=handle
  787.         OS_CLOSEHANDLE
  788.         ret
  789.  
  790. savefile
  791. ;de=filename
  792. ;hl=addr
  793. ;bc=size
  794.         push hl ;addr
  795.         push bc ;size
  796.         OS_CREATEHANDLE
  797.         pop hl ;size
  798.         pop de ;addr
  799.         push bc ;b=handle
  800.         OS_WRITEHANDLE
  801.         pop bc ;b=handle
  802.         OS_CLOSEHANDLE
  803.         ret
  804.  
  805. path
  806.         db "zxbattle",0
  807. fn_hiscore
  808.         db "hi_score.dat",0
  809. fn_soundfx
  810.         db "sound_fx.bin",0
  811. fn_muzmain
  812.         db "muz_main.dat",0
  813. fn_muzboss
  814.         db "muz_boss.dat",0
  815. fn_muzend
  816.         db "muz_end.dat",0
  817.         if TILES87
  818. fn_lvl0116
  819.         db "lvl_0116.dat",0
  820. fn_lvl1732
  821.         db "lvl_1732.dat",0
  822.         else
  823. fn_lvl0116
  824.         db "lvln0116.dat",0
  825. fn_lvl1732
  826.         db "lvln1732.dat",0
  827.         endif
  828. fn_lvl00us
  829.         db "lvl_00us.dat",0
  830. fn_spr0
  831.         db "spr0.dat",0
  832. fn_spr1
  833.         db "spr1.dat",0
  834. fn_spr2
  835.         db "spr2.dat",0
  836. fn_spr3
  837.         db "spr3.dat",0
  838. fn_tiles
  839.         db "font.bin",0
  840. bgfilename
  841.         db "menu.bmp",0
  842.  
  843.         macro PRTILE
  844.        dup TILEHGT-1
  845.         ld a,(de)
  846.         inc d
  847.         ld (hl),a
  848.          set 6,h
  849.         ld a,(de)
  850.         inc d
  851.         ld (hl),a
  852.          set 5,h
  853.         ld a,(de)
  854.         inc d
  855.         ld (hl),a
  856.          res 6,h
  857.         ld a,(de)
  858.         inc d
  859.         ld (hl),a
  860.         add hl,bc
  861.        edup
  862.         ld a,(de)
  863.         inc d
  864.         ld (hl),a
  865.          set 6,h
  866.         ld a,(de)
  867.         inc d
  868.         ld (hl),a
  869.          set 5,h
  870.         ld a,(de)
  871.         inc d
  872.         ld (hl),a
  873.          res 6,h
  874.         ld a,(de)
  875.         ld (hl),a  
  876.         endm
  877.  
  878. drawlefttile
  879.         ;jp drawleftandrighttiles
  880.         ld hl,-2-0x800
  881.         add hl,sp
  882. ;de=screen line start
  883.      push de
  884.         res 3,h
  885.          ld a,l
  886.          and 0x3f
  887.          add a,e
  888.          ld e,a
  889.          jr nc,$+3
  890.           inc d
  891.         ld l,(hl)
  892.         ex de,hl
  893.         ld d,0x60
  894.         PRTILE
  895.      pop de
  896.         ret
  897.  
  898. drawrighttile
  899.         ;jp drawleftandrighttiles
  900.         ld hl,-2+1-0x800
  901.         add hl,sp
  902. ;de=screen line start
  903.      push de
  904.         res 3,h
  905.          ld a,l
  906.          and 0x3f
  907.          add a,e
  908.          ld e,a
  909.          jr nc,$+3
  910.           inc d
  911.         ld l,(hl)
  912.         ex de,hl
  913.         ld d,0x60
  914.         PRTILE
  915.      pop de
  916.         ret
  917.  
  918. drawleftandrighttiles
  919.         ld hl,-2+1-0x800
  920.         add hl,sp
  921. ;de=screen line start
  922.      push de
  923.         res 3,h
  924.         ld a,(hl) ;right tile
  925.         ex af,af' ;'
  926.         dec l
  927.          ld a,l
  928.          and 0x3f
  929.          add a,e
  930.          ld e,a
  931.          jr nc,$+3
  932.           inc d
  933.         ld l,(hl) ;left tile
  934.         ex de,hl
  935.        push hl ;screen (even x)
  936.         ld d,0x60
  937.         PRTILE
  938.        pop hl ;screen (even x)
  939.        inc l ;screen (odd x)
  940.         ex af,af' ;'
  941.         ld e,a ;right tile
  942.         ld d,0x60
  943.         PRTILE
  944.      pop de
  945.         ret
  946.  
  947. nexttileliner
  948.         ld hl,TILEHGT*40;-40
  949.         add hl,de ;screen
  950.         ex de,hl
  951.         ld hl,BYTESPERTILELINE-40-2
  952.         add hl,sp
  953.         ld sp,hl
  954.         ret
  955.  
  956. showtiles
  957.         ld (showtilessp),sp
  958. showtilesaddrpatch=$+1
  959.        if TILES87
  960.         ld sp,tilemap+0x800+BYTESPERTILELINE
  961.        else
  962.         ld sp,tilemap+0x800+(BYTESPERTILELINE*TOPYVISIBLE/8)
  963.        endif
  964.         ld de,0x8000
  965.         ld bc,40-0x2000
  966.        ret
  967. ;если флаг отрисовки хранится отдельно (через set N,d), то:
  968.         ;ret -> пропуск или рисование левого или правого или обоих тайлов
  969. ;но тогда надо флаги для 0 и 1 экранов хранить в отдельных таблицах, т.к. они запарываются стеком. и после отрисовки залить текущую таблицу push'ами
  970. endtileliner
  971. showtilessp=$+1
  972.         ld sp,0
  973. ;сейчас при куче спрайтов
  974. ;53000 + 8419(resettileflags)
  975. ;TODO делать reset только там, где отрисовка, и по прерыванию (причём прерывание должно восстанавливать адрес nexttileliner)
  976.         ret
  977.  
  978. resettileflags
  979. ;hl=start of visible tiles
  980.         ;ld bc,TILEFLAG0*0x0101
  981. ;bc=TILEFLAG0*0x0101 or TILEFLAG1*0x0101
  982.         ld (filltileflagsp),sp
  983.        if TILES87
  984.         ld de,28*64+40+2
  985.         ld hx,29
  986.        else
  987.         ld de,24*64+40+2
  988.         ld hx,25
  989.        endif
  990.         add hl,de
  991.         ld de,endtileliner
  992. filltileflagline0
  993.         ld sp,hl
  994.         push de
  995.         dup 40/2
  996.         push bc
  997.         edup
  998.         ld de,-BYTESPERTILELINE
  999.         add hl,de
  1000.         ld de,nexttileliner
  1001.         dec hx
  1002.         jp nz,filltileflagline0
  1003. filltileflagsp=$+1
  1004.         ld sp,0
  1005.         ret
  1006.  
  1007. showsprites
  1008.         ld hl,tileaddrpatch+1
  1009.         ld a,(hl)
  1010.         xor 0x18
  1011.         ld (hl),a
  1012.         ld hl,showtilesaddrpatch+1
  1013.         ld a,(hl)
  1014.         xor 0x18
  1015.         ld (hl),a
  1016.        
  1017.         call setpgsscr8000c000
  1018.         call setpgc2_4000;setpggfxc000
  1019.          ;jr $
  1020.         call showtiles
  1021.        
  1022.         ld hl,(showtilesaddrpatch)
  1023.         ld bc,TILEFLAG0*0x0101
  1024.          ;ld bc,TILEFLAG1*0x0101
  1025.         call resettileflags
  1026.        
  1027.         call setpgsscr40008000
  1028.        ;jp showsprites0q
  1029.         ld ix,sprlist
  1030.         ld b,85
  1031. showsprites0
  1032. ;+0: y
  1033. ;+1: 2(ysize:SPSIZ16) +0x20(SPACT) +0x40(deact) +0x80(mirrorvert) +1(SPSIZBS)
  1034. ;+2: x
  1035. ;+3: 2(xsize:SPSIZ16) +1(SPSIZBS) +0x80(mirrorhor)
  1036. ;+4,5: pattern number
  1037.         ld a,(ix+1)
  1038.         or a
  1039.         jp z,showsprites0skip
  1040.         bit 6,a
  1041.         jp nz,showsprites0skip
  1042.         ;jp nz,showsprites0q ;не видно бонус
  1043.         bit 5,a
  1044.         jp z,showsprites0skip
  1045. ;ix+1 bit7 = mirror vert
  1046. ;ix+3 bit7 = mirror hor
  1047.         rla
  1048.         ld a,(ix+3)
  1049.         rla
  1050.         rla
  1051.         and 3 ;%000000vh
  1052.         or 0xc0
  1053.         ld (prspr_type+1),a
  1054.        push bc
  1055.         ld a,(ix+4) ;sprite pattern ;00(up/down),04(left/right)
  1056.         ld (prspr_type),a
  1057.         bit 5,a
  1058.         jr nz,prspr_setpgright
  1059.        bit 0,(ix+5) ;+256
  1060.         call z,setpgc0 ;left sprites (tanks)
  1061.         call nz,setpgspr2
  1062.        bit 1,(ix+5) ;+512
  1063.         call nz,setpgspr3
  1064.         jp prspr_setpgq
  1065. prspr_setpgright
  1066.         call setpgc1 ;right sprites (bullets)
  1067. prspr_setpgq
  1068.        if TILES87
  1069.         ld c,(ix+0) ;y
  1070.         ld a,c
  1071.          add a,4+(2*8)
  1072.         rra
  1073.         rra
  1074.         rra
  1075.         and 0x1f ;*1/8
  1076.         cpl
  1077.         ;inc a
  1078.         add a,c ;*7/8 (округление такое: 0,1,2,3,3,4,5,6, 7,8,9,10,10,11,12,13...
  1079.          add a,sprmaxhgt-1 +2 -6;7
  1080.          cp 199+sprmaxhgt-1 ;защита от второго взрыва сверху с отрицательным y
  1081.          jp nc,showsprites0popbcskip
  1082.          sub sprmaxhgt-1;6;7
  1083.          ;sub 6;7
  1084.        else
  1085.         ld a,(ix+0) ;y
  1086.         add a,sprmaxhgt-1 -TOPYVISIBLE
  1087.          cp 199+sprmaxhgt-1 ;защита от второго взрыва сверху с отрицательным y
  1088.          jp nc,showsprites0popbcskip
  1089.          sub sprmaxhgt-1;6;7      
  1090.        endif
  1091.         ld c,a ;y
  1092.         ld a,(ix+3) ;xsize, xhsb
  1093.         rra
  1094.         ld a,(ix+2) ;x
  1095.         rra
  1096.         add a,sprmaxwid-1
  1097.         ld e,a
  1098. prspr_type=$+2
  1099.         ld iy,(0xc000)
  1100. ;e=x = -(sprmaxwid-1)..159 (кодируется как x/2+(sprmaxwid-1))
  1101. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1102.        push ix
  1103.        push de
  1104.          ld a,(iy-3) ;sprhgt
  1105.          cp 16
  1106.          jr nz,prspr_bighgt
  1107.         call prspr
  1108.        pop de
  1109.        pop ix
  1110.        ;ставим флаги обновления на тайлах под спрайтом
  1111.         ld c,(ix+0) ;y
  1112.        ld a,e ;x/2
  1113.        sub sprmaxwid-1
  1114.        jr nc,$+3
  1115.         xor a
  1116.        and 0xfc
  1117.        ld e,a ;x/2
  1118.        ld a,c ;y
  1119.        and 0xf8
  1120.         cp 8*29;30
  1121.         jr c,$+3
  1122.          xor a
  1123.        ld l,a
  1124.        ld h,0
  1125.        ld d,h;0
  1126.        add hl,hl
  1127.        add hl,hl
  1128.        add hl,hl ;Y*64
  1129.        if BYTESPERTILE == 2
  1130.         add hl,hl ;*128
  1131.        endif
  1132.        srl e
  1133.        if BYTESPERTILE == 1
  1134.        srl e
  1135.        endif
  1136.        add hl,de
  1137. tileaddrpatch=$+1
  1138.        ld de,tilemap+0x800
  1139.        add hl,de
  1140.         ld a,(ix+2) ;x
  1141.         and 7
  1142.        ld a,TILEFLAG1
  1143.        ld (hl),a
  1144.         jr z,prsprwid2
  1145.        dup BYTESPERTILE
  1146.        inc l
  1147.        edup
  1148.        ld (hl),a
  1149.        dup BYTESPERTILE
  1150.        inc l
  1151.        edup
  1152.        ld (hl),a
  1153.        ld de,BYTESPERTILELINE-(2*BYTESPERTILE)
  1154.        add hl,de
  1155.        ld (hl),a
  1156.        dup BYTESPERTILE
  1157.        inc l
  1158.        edup
  1159.        ld (hl),a
  1160.        dup BYTESPERTILE
  1161.        inc l
  1162.        edup
  1163.        ld (hl),a
  1164.        add hl,de
  1165.        ld (hl),a
  1166.        dup BYTESPERTILE
  1167.        inc l
  1168.        edup
  1169.        ld (hl),a
  1170.        dup BYTESPERTILE
  1171.        inc l
  1172.        edup
  1173.        ld (hl),a
  1174.       if TILES87
  1175. ;из-за тайлов высотой 7 при y=6 приходится обновить четыре ряда:
  1176.         ld a,c ;y
  1177.         cpl
  1178.         and 7
  1179.         jr nz,prsprhgt3q
  1180.         ld a,TILEFLAG1
  1181.        add hl,de
  1182.        ld (hl),a
  1183.        dup BYTESPERTILE
  1184.        inc l
  1185.        edup
  1186.        ld (hl),a
  1187.        dup BYTESPERTILE
  1188.        inc l
  1189.        edup
  1190.        ld (hl),a
  1191.       endif
  1192.        jp prsprhgt3q
  1193.  
  1194. prsprwid2
  1195.        dup BYTESPERTILE
  1196.        inc l
  1197.        edup
  1198.        ld (hl),a
  1199.        ld de,BYTESPERTILELINE-(1*BYTESPERTILE)
  1200.        add hl,de
  1201.        ld (hl),a
  1202.        dup BYTESPERTILE
  1203.        inc l
  1204.        edup
  1205.        ld (hl),a
  1206.        add hl,de
  1207.        ld (hl),a
  1208.        dup BYTESPERTILE
  1209.        inc l
  1210.        edup
  1211.        ld (hl),a
  1212.       if TILES87
  1213. ;из-за тайлов высотой 7 при y=6 приходится обновить четыре ряда:
  1214.         ld a,c ;y
  1215.         cpl
  1216.         and 7
  1217.         jr nz,prsprhgt3q
  1218.         ld a,TILEFLAG1
  1219.        add hl,de
  1220.        ld (hl),a
  1221.        dup BYTESPERTILE
  1222.        inc l
  1223.        edup
  1224.        ld (hl),a
  1225.       endif
  1226.        jp prsprhgt3q
  1227. prspr_bighgt
  1228.         call prspr
  1229.        pop de
  1230.        pop ix
  1231.      if 1==1
  1232.        ;ставим флаги обновления на тайлах под спрайтом
  1233.         ld c,(ix+0) ;y
  1234.        ld a,e ;x/2
  1235.        sub sprmaxwid-1
  1236.        jr nc,$+3
  1237.         xor a
  1238.        and 0xfc
  1239.        ld e,a ;x/2
  1240.        ld a,c ;y
  1241.        and 0xf8
  1242.        ld l,a
  1243.        ld h,0
  1244.        ld d,h;0
  1245.        add hl,hl
  1246.        add hl,hl
  1247.        add hl,hl ;Y*64
  1248.        if BYTESPERTILE == 2
  1249.         add hl,hl ;*128
  1250.        endif
  1251.        srl e
  1252.        if BYTESPERTILE == 1
  1253.        srl e
  1254.        endif
  1255.        add hl,de
  1256.        ld de,(tileaddrpatch)
  1257.        add hl,de
  1258.        ld de,BYTESPERTILELINE-(4*BYTESPERTILE)
  1259.       if TILES87
  1260.        ld b,6
  1261.       else
  1262.        ld b,5
  1263.       endif
  1264. prspr_bighgt1
  1265.        ld a,TILEFLAG1
  1266.        ld (hl),a
  1267.       dup 4
  1268.        dup BYTESPERTILE
  1269.        inc hl ;нельзя l, не компенсируется add
  1270.        edup
  1271.        ld (hl),a
  1272.       edup
  1273.       ld a,h
  1274.        add hl,de
  1275.       xor h
  1276.       and 0xf8 ;остаёмся в рамках одной карты флагов!
  1277.       xor h
  1278.       ld h,a
  1279.        djnz prspr_bighgt1
  1280.      endif
  1281.        jp prsprhgt3q
  1282. prsprhgt3q
  1283.  
  1284. ;если спрайт - танк (не бонус)
  1285. ;draw tree (one or many) above sprite if needed
  1286.        if TILES87
  1287.        else
  1288.         bit 5,(ix+4)
  1289.         jp nz,prspr_tree_q ;не танк
  1290.         call setpgc1 ;right sprites (bullets)
  1291.         ld a,(ix+0) ;y
  1292.          and 0xf0
  1293.         ld l,a ;y for tilemap
  1294.         sub TOPYVISIBLE
  1295.         ;add a,sprmaxhgt-1 -TOPYVISIBLE
  1296.          ;cp 199+sprmaxhgt-1 ;защита от второго взрыва сверху с отрицательным y
  1297.          ;jp nc,showsprites0popbcskip
  1298.          ;sub sprmaxhgt-1;6;7      
  1299.         ld c,a ;y for prspr
  1300.         ld a,(ix+3) ;xsize, xhsb
  1301.         rra
  1302.         ld a,(ix+2) ;x
  1303.         rra
  1304.          and 0xf8
  1305.        ld e,a ;x/2 for tilemap
  1306.         add a,sprmaxwid-1
  1307.         ld b,a ;x/2 for prspr
  1308.        ;ld l,c ;y = Y*8
  1309.        ld h,0
  1310.        ld d,h;0
  1311.        add hl,hl
  1312.        add hl,hl
  1313.        add hl,hl ;Y*64
  1314.        srl e
  1315.        srl e ;x/8
  1316.        add hl,de
  1317.        ld de,tilemap;+(TOPYVISIBLE/8*BYTESPERTILELINE)
  1318.        add hl,de
  1319.        push bc
  1320.        push hl
  1321.        ld e,b ;x/2
  1322.        ld a,(hl)
  1323.        cp 24 ;tree
  1324.         ld iy,(0xc000+62)
  1325. ;e=x = -(sprmaxwid-1)..159 (кодируется как x/2+(sprmaxwid-1))
  1326. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1327.        push ix
  1328.         call z,prspr ;округление x влево, y вверх
  1329.        pop ix
  1330.        pop hl
  1331.        pop bc
  1332.        
  1333.         ld a,(ix+2) ;x
  1334.         and 0x0e
  1335.         jr z,prspr_tree_xrightq ;округлять x вправо не требуется
  1336.        push bc
  1337.        push hl
  1338.        inc l
  1339.        inc l
  1340.        ld a,b ;x/2
  1341.        add a,8
  1342.        ld e,a
  1343.        ld a,(hl)
  1344.        cp 24 ;tree
  1345.         ld iy,(0xc000+62)
  1346. ;e=x = -(sprmaxwid-1)..159 (кодируется как x/2+(sprmaxwid-1))
  1347. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1348.        push ix
  1349.         call z,prspr ;округление x влево, y вверх
  1350.        pop ix
  1351.        pop hl
  1352.        pop bc
  1353. prspr_tree_xrightq
  1354.        
  1355.         ld a,(ix+0) ;y
  1356.         and 0x0f
  1357.         jr z,prspr_tree_q ;округлять y вниз не требуется
  1358.        ld de,BYTESPERTILELINE*2
  1359.        add hl,de
  1360.        ld a,c
  1361.        add a,16
  1362.        ld c,a ;y
  1363.        push bc
  1364.        push hl
  1365.        ld e,b ;x/2
  1366.        ld a,(hl)
  1367.        cp 24 ;tree
  1368.         ld iy,(0xc000+62)
  1369. ;e=x = -(sprmaxwid-1)..159 (кодируется как x/2+(sprmaxwid-1))
  1370. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1371.        push ix
  1372.         call z,prspr ;округление x влево, y вверх
  1373.        pop ix
  1374.        pop hl
  1375.        pop bc
  1376.  
  1377.         ld a,(ix+2) ;x
  1378.         and 0x0e
  1379.         jr z,prspr_tree_q ;округлять x вправо не требуется
  1380.        inc l
  1381.        inc l
  1382.        ld a,b ;x/2
  1383.        add a,8
  1384.        ld e,a
  1385.        ld a,(hl)
  1386.        cp 24 ;tree
  1387.         ld iy,(0xc000+62)
  1388. ;e=x = -(sprmaxwid-1)..159 (кодируется как x/2+(sprmaxwid-1))
  1389. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1390.        push ix
  1391.         call z,prspr ;округление x влево, y вверх
  1392.        pop ix      
  1393. prspr_tree_q
  1394.        endif
  1395.        
  1396.        
  1397. showsprites0popbcskip
  1398.        pop bc
  1399. showsprites0skip
  1400.         ld de,6
  1401.         add ix,de
  1402.         dec b
  1403.         jp nz,showsprites0
  1404. showsprites0q
  1405. ;сейчас примерно 82000 при куче спрайтов
  1406.  
  1407.         call setpgsmain40008000
  1408.         call setpg8
  1409.         ret
  1410.  
  1411. border1
  1412.         xor a
  1413.         ld (curborder),a
  1414.         ;ld e,0;1
  1415.         ;OS_SETBORDER
  1416.         ret
  1417. border8
  1418.         ld a,12
  1419.         ld (curborder),a
  1420.         ;ld e,12
  1421.         ;OS_SETBORDER
  1422.         ret
  1423.  
  1424. setpg8 ;area?
  1425. pgarea=$+1
  1426.         ld a,0
  1427.         SETPG32KHIGH
  1428.         ret
  1429. setpgc ;ending music
  1430. pgmuzend=$+1
  1431.         ld a,0
  1432.         SETPG32KHIGH
  1433.         ret
  1434. setpg16 ;levels 01-16
  1435. pglvl0=$+1
  1436.         ld a,0
  1437.         SETPG32KHIGH
  1438.         ret
  1439. setpg17 ;levels 17-32
  1440. pglvl1=$+1
  1441.         ld a,0
  1442.         SETPG32KHIGH
  1443.         ret
  1444. setpg18 ;level 00 user
  1445. pglvl2=$+1
  1446.         ld a,0
  1447.         SETPG32KHIGH
  1448.         ret
  1449. setpgc0 ;spr0 ;left sprites (tanks)
  1450. pgspr0=$+1
  1451.         ld a,0
  1452.         SETPG32KHIGH
  1453.         ret
  1454. setpgc1 ;spr1 ;right sprites (bullets)
  1455. pgspr1=$+1
  1456.         ld a,0
  1457.         SETPG32KHIGH
  1458.         ret
  1459. setpgc2_4000
  1460.         ld a,(pgtiles)
  1461.         SETPG16K
  1462.         ret
  1463. setpgc2 ;tiles
  1464. pgtiles=$+1
  1465.         ld a,0
  1466.         SETPG32KHIGH
  1467.         ret
  1468. setpgc3 ;main music, boss music
  1469. pgmuzmain=$+1
  1470.         ld a,0
  1471.         SETPG32KHIGH
  1472.         ret
  1473. setpgspr2
  1474. pgspr2=$+1
  1475.         ld a,0
  1476.         SETPG32KHIGH
  1477.         ret
  1478. setpgspr3
  1479. pgspr3=$+1
  1480.         ld a,0
  1481.         SETPG32KHIGH
  1482.         ret
  1483. setpg
  1484. ;a=(SM1),(SM2) ;#10..#13???
  1485.        ret
  1486.         ld ($+4),a
  1487.         ld a,(tpgs)
  1488.         SETPG32KHIGH
  1489.         ret
  1490.  
  1491.  
  1492. genpush_newpage
  1493. ;заказывает страницу, заносит в tpushpgs, a=pg
  1494.         push bc
  1495.         push de
  1496.         push hl
  1497.         push ix
  1498.         OS_NEWPAGE
  1499.         pop ix
  1500.         ld a,e
  1501.         ld (ix),a
  1502.         ld de,4
  1503.         add ix,de
  1504.         pop hl
  1505.         pop de
  1506.         pop bc
  1507.         ret
  1508.  
  1509.         INCLUDE "bgpush.asm"
  1510.         INCLUDE "bmp.asm"
  1511.         include "../../_sdk/file.asm"
  1512. bgpush_bmpbuf=0x4000 ;ds 1024;320 ;заголовок bmp или одна строка
  1513. bgpush_loadbmplinestack=bgpush_bmpbuf+1024 ;ds pushhgt*2+32
  1514.  
  1515.         align 256
  1516. trecodebyteleft
  1517.         dup 256
  1518. ;%00003210 => %.3...210
  1519. _3=$&8
  1520. _210=$&7
  1521.         db (_3*0x08) + (_210*0x01)
  1522.         edup
  1523.        
  1524. trecodebyteright
  1525.         dup 256
  1526. ;%00003210 => %3.210...
  1527. _3=$&8
  1528. _210=$&7
  1529.         db (_3*0x10) + (_210*0x08)
  1530.         edup
  1531.  
  1532.         align 256
  1533. tpushpgs ;номера 0..15
  1534. tpgs ;номера 16..
  1535.         ds 256
  1536.         ;align 256
  1537.         ds TILEFLAG0*256+TILEFLAG0-$
  1538.         ret
  1539.         ds TILEFLAG0*256+TILEFLAG1-$
  1540.         jp drawlefttile
  1541.         ds TILEFLAG1*256+TILEFLAG0-$
  1542.         jp drawrighttile
  1543.         ds TILEFLAG1*256+TILEFLAG1-$
  1544.         jp drawleftandrighttiles
  1545.  
  1546.         ds 0x2000-$
  1547. tilemap
  1548.        if BYTESPERTILE == 1
  1549.         ds 64*32*BYTESPERTILE
  1550.         ds 64*32*BYTESPERTILE ;scr0 update flags
  1551.        endif
  1552.         ds 64*35*BYTESPERTILE ;scr1 update flags ;40*25 ;35 - запас на любой y при обновлении 4 рядов
  1553.  
  1554.         INCLUDE "int.asm"
  1555.         INCLUDE "mem.asm"
  1556.         INCLUDE "prspr.asm"
  1557.  
  1558.         display $,"<0x3ee0"
  1559.         ds 0x4000-$
  1560.  
  1561.         INCLUDE "XASASM1.a80"
  1562.         INCLUDE "BC1.a80"
  1563.         INCLUDE "BC2.a80"
  1564.         INCLUDE "units.asm"
  1565.         INCLUDE "BC3.a80"
  1566.         INCLUDE "BC4.a80"
  1567.  
  1568. end
  1569.  
  1570.         ;display "End=",end
  1571.         ;display "Free after end=",/d,#c000-end
  1572.         ;display "Size ",/d,end-begin," bytes"
  1573.         display "UP1=",UP1
  1574.         display "MAP=",MAP
  1575.  
  1576.         savebin "zxbattle.com",begin,end-begin
  1577.  
  1578.         LABELSLIST "../../../us/user.l"
  1579.