?login_element?

Subversion Repositories NedoOS

Rev

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

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