Subversion Repositories NedoOS

Rev

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

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