Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM1024
  2.         include "../../_sdk/sys_h.asm"
  3.  
  4. OLDDRAWSPR=0;1
  5.  
  6. scrbase=0x4000
  7. sprmaxwid=32
  8. sprmaxhgt=32
  9. scrwid=160 ;double pixels
  10. scrhgt=192-16;200
  11. clswid=40 ;*8
  12. clshgt=200
  13.  
  14. STACK=0x3ff0 ;место для вылетания за экран
  15. tempsp=0x3f06 ;6 bytes for prspr
  16. INTSTACK=0x3f00;0x3b80 ;чтобы не запороть стек загрузки bmp в bgpush (теперь он в 0x4000+)
  17.  
  18. XSUBPIX8=8
  19. YSUBPIX8=8
  20.  
  21. MAXSPEED=4*XSUBPIX8
  22. CAMERATRACKINGSPEED_X=16 ;double pixels
  23. CAMERATRACKINGSPEED_Y=16
  24. CAMERASHIFTSPEED_X=4 ;double pixels
  25. CAMERASHIFTSPEED_Y=4
  26.  
  27. FIRSTSOLIDTILE=32
  28. FIRSTBETONTILE=64
  29. FIRSTOBJTILE=111
  30.  
  31. ;PENT=0
  32.  
  33.  
  34. uvscroll_scrbase=0x4000
  35. uvscroll_pushbase=0x8000
  36. uvscroll_callbase=0xc000
  37.  
  38.  
  39. UVSCROLL_WID=1024
  40. UVSCROLL_HGT=256;512
  41. TILEMAPWID=42 ;целые метатайлы
  42. TILEMAPHGT=24 ;целые метатайлы
  43. UVSCROLL_SCRWID=320 ;8*(TILEMAPWID-2)
  44. UVSCROLL_SCRHGT=192-16 ;(делится на 16!!!) ;8*(TILEMAPHGT-2) ;чтобы выводить всегда 12 метатайлов (3 блока по 8) по высоте
  45. UVSCROLL_NPUSHES=UVSCROLL_WID/2/4/2
  46. UVSCROLL_SCRNPUSHES=UVSCROLL_SCRWID/2/4/2
  47.  
  48. UVSCROLL_SCRSTART=uvscroll_scrbase+((UVSCROLL_SCRHGT-1)*40)
  49. UVSCROLL_LINESTEP=-40
  50.  
  51. UVSCROLL_NCALLPGS=4
  52.  
  53. UVSCROLL_TEMPSP=tempsp
  54.  
  55. METATILEMAPWID=256;64
  56. METATILEMAPHGT=64
  57. TILEGFX=0xc000
  58.  
  59. DELETEDYHIGH=0x7f
  60.  
  61. pushbase=0x8000;c000
  62.         macro SETPGPUSHBASE
  63.          ;ld (curpgc000),a
  64.          ;SETPG32KHIGH
  65.         ;ld (curpg8000),a
  66.         SETPG32KLOW
  67.         endm
  68.  
  69.         macro RECODEBYTE
  70.         ld a,(de)
  71.         ld ($+4),a
  72.         ld a,(trecodebyteright)
  73.         ld c,a
  74.         dec de
  75.         ld a,(de)
  76.         dec de
  77.         ld ($+4),a
  78.         ld a,(trecodebyteleft)
  79.         or c
  80.         endm        
  81.  
  82.         org PROGSTART
  83. begin
  84.         jp GO ;/prsprqwid (спрайты в файле подготовлены так, что выходят сюда)
  85. GO
  86.         ld sp,STACK
  87.         OS_HIDEFROMPARENT
  88.  
  89. ;        ld b,25
  90. ;waitcls0
  91. ;        push bc
  92. ;        YIELD
  93. ;        pop bc
  94. ;        djnz waitcls0 ;чтобы nv не перехватил фокус при вызове через комстроку
  95.  
  96.         ld e,0
  97.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  98.         ld e,0
  99.         OS_SETSCREEN
  100.         ld e,0 ;color byte
  101.         OS_CLS
  102.         ld e,1
  103.         OS_SETSCREEN
  104.         ld e,0 ;color byte
  105.         OS_CLS
  106.        
  107.         OS_GETMAINPAGES
  108. ;dehl=номера страниц в 0000,4000,8000,c000
  109.         ld a,e
  110.         LD (pgmain4000),A
  111.         ld a,h
  112.         LD (pgmain8000),A
  113.         call setpgsmain40008000 ;записать в curpg...
  114.  
  115.         ;OS_GETSCREENPAGES
  116. ;de=страницы 0-го экрана (d=старшая), hl=страницы 1-го экрана (h=старшая)
  117.         ;ld a,l
  118.         ;ld (setpgs_scr_low),a
  119.         ;xor e
  120.         ;ld (setpgs_scr_scrxor),a
  121.         ;ld a,h
  122.          ;ld (ttexpgs+31),a ;ld (IR128),a ;на всякой случай, для прерывания
  123.         ;xor l
  124.         ;ld (setpgs_scr_pgxor),a
  125.  
  126.         OS_NEWPAGE
  127.         ld a,e
  128.         ld (pgfake),a ;эту страницу можно будет запарывать при отрисовке спрайтов с клипированием
  129.         ld (pgfake2),a
  130.        
  131.         ld de,res_path
  132.         OS_CHDIR
  133.  
  134.         call getmousedelta ;prepare mouse
  135.  
  136.         ld hl,texfilename
  137.         ;call loadpage
  138.         ;ld (pg0),a
  139.         call loadpage
  140.         ld (pg1),a
  141.         call loadpage
  142.         ld (pgsfx),a
  143.         call loadpage
  144.         ld (pgmusic),a
  145.         SETPG16K
  146.         push af
  147.         call 0x4000 ;init
  148.        
  149.         ld a,(pgsfx)
  150.         SETPG32KLOW
  151.         pop af
  152.         ld hl,0x4005 ;play
  153.         OS_SETMUSIC
  154.         call setpgsmain40008000
  155.        
  156.         ld hl,prsprqwid
  157.         ld (0x0101),hl ;спрайты в файле подготовлены так, что выходят в 0x0100
  158.      
  159.         call swapimer
  160.  
  161. ;UV scroll
  162.         call uvscroll_prepare
  163.         ;ld de,bgxyfilename
  164.         ;call uvscroll_preparebmp
  165.          call uvscroll_preparetiles
  166. ;TODO обновить allscroll
  167. ;allscroll=yscroll*(UVSCROLL_WID/512)+xscroll
  168.         ;jr $
  169.         ;ld hl,1;+(511*2)+(1023/256)
  170.         ;ld a,1023&0xff
  171.         ;ld (allscroll),hl
  172.         ;ld (allscroll_lsb),a
  173.         ld hl,-160 ;top left
  174.         if 1==0
  175.         ld hl,+80
  176.         ld bc,(objects+obj.y16)
  177.          dup 3
  178.          srl b
  179.          rr c
  180.          edup
  181.         or a
  182.         sbc hl,bc
  183.         endif
  184.         ld (cameraym),hl
  185.         ld (cameraymideal),hl
  186.         ld (cameraymold),hl
  187.         ld de,1024-160 ;top left
  188.         add hl,de
  189.         ld (yscroll),hl
  190.        
  191.         ld hl,-160 ;top left
  192.         if 1==0
  193.         ld hl,+80
  194.         ld bc,(objects+obj.x16)
  195.          dup 3
  196.          srl b
  197.          rr c
  198.          edup
  199.         or a
  200.         sbc hl,bc
  201.         endif
  202.         ld (cameraxm),hl
  203.         ld (cameraxmideal),hl
  204.         ld (cameraxmold),hl
  205.         ld de,2048-160 ;top left
  206.         add hl,de
  207.         ld (x2scroll),hl
  208.  
  209.          call uvscroll_preparetilemap
  210.  
  211.         call importcoords
  212.         ld iy,bullets
  213.         call genbullet_terminate
  214.  
  215.         ld de,pal
  216.         OS_SETPAL
  217. mainloop_uv0
  218.         ;halt
  219.         call uvscroll_draw ;367574/391621
  220.        
  221.         if OLDDRAWSPR==1
  222.         ld ix,objects
  223.         call drawsprites
  224.         ld ix,bullets
  225.         call drawsprites
  226.        
  227.         else
  228.         ld de,spritesA+1
  229.         ld ix,objects
  230.         call preparedrawsprites ;1720
  231.         ld ix,bullets
  232.         call preparedrawsprites ;1110
  233.         dec de
  234.         ld (drawsprites_data),de
  235.         call drawsprites ;24040 (только герой)
  236.         endif
  237.  
  238.         ;call prcoords
  239.  
  240.         call getmousedelta ;de=delta (d>0: go up) (e>0: go left), l=mousekey
  241.         push hl
  242. trackcamera_addr=$+1
  243.         ;call mousetrackcamera ;de=delta (d>0: go up) (e>0: go left) ;out: d=camera dy, e=camera dx        
  244.         call trackcamera ;de=delta (d>0: go up) (e>0: go left) ;out: d=camera dy, e=camera dx        
  245.         pop hl ;l=mousekey
  246.        
  247.         ld a,l
  248.         bit 1,a
  249.         jr nz,nocamoff
  250.         ld bc,notrackcamera
  251.         ld (trackcamera_addr),bc
  252. nocamoff
  253.        
  254. ;d=camera dy
  255. ;e=camera dx
  256. ;l=mousekey
  257.        
  258.         ld a,l ;hl=(sysmousebuttons)
  259.         rra
  260.          ;jr nc,mainloop_uvq ;LMB
  261.         call uvscroll_scroll
  262.         call uvscroll_scrolltiles ;23099(21121 ldir)/46220
  263.        
  264.        ld a,(timer)
  265.        push af
  266.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  267.  
  268. mainloop_uvwaittimer0
  269.         ld a,(timer)
  270. uvoldtimer=$+1
  271.         ld b,0
  272.         ld (uvoldtimer),a
  273.         sub b
  274.         ld b,a
  275.         jr z,mainloop_uvwaittimer0
  276. mainloop_uvlogic0
  277.         push bc
  278.         call logic
  279.         pop bc
  280.         djnz mainloop_uvlogic0
  281.  
  282. ;можем начать новую отрисовку, только если с момента changescrpg прошло хотя бы одно прерывание (возможно, внутри logic)
  283.        pop bc ;b=timer на момент changescrpg
  284. waitchangescr0
  285.         ld a,(timer)
  286.         cp b
  287.         jr z,waitchangescr0
  288.  
  289.         ld a,(curkey)
  290.         cp key_esc
  291.         jp nz,mainloop_uv0
  292. mainloop_uvq
  293.  
  294.         if 1==1
  295.  
  296. ;vertical scroll
  297.         ld de,bgfilename
  298.         call bgpush_prepare
  299.  
  300.         call cls
  301.         ld de,pal;SUMMERPAL
  302.         OS_SETPAL
  303.  
  304.         if 1==0
  305. pg0=$+1
  306.         ld a,0
  307.         call setpgc000;SETPG32KHIGH
  308.         ld hl,0x4000 ;scr
  309.         ld de,0xc000 ;gfx
  310.         ld bc,0xc020 ;hgt,wid
  311.         call primgega
  312.         endif
  313.  
  314. mainloop
  315.         ld bc,-1
  316.         call bgpush_inccurscroll
  317.  
  318.         call bgpush_draw ;359975t
  319.  
  320.         ld de,spritesA+1
  321.         call preparedrawsprites
  322.         dec de
  323.         ld (drawsprites_data),de
  324.         call drawsprites
  325.        
  326.        ld a,(timer)
  327.        push af
  328.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  329.        
  330. mainloopwaittimer0
  331.         ld a,(timer)
  332. oldtimer=$+1
  333.         ld b,0
  334.         ld (oldtimer),a
  335.         sub b
  336.         ld b,a
  337.         jr z,mainloopwaittimer0
  338. mainlooplogic0
  339.         push bc
  340.         call logic
  341.         pop bc
  342.         djnz mainlooplogic0
  343.        
  344. ;можем начать новую отрисовку, только если с момента changescrpg прошло хотя бы одно прерывание (возможно, внутри logic)
  345.        pop bc ;b=timer на момент changescrpg
  346. waitchangescr1
  347.         ld a,(timer)
  348.         cp b
  349.         jr z,waitchangescr1
  350.        
  351. ;waitkey
  352.         ;halt ;в играх не юзаем YIELD, иначе может сработать чужой обработчик прерываний
  353.         ld a,(curkey)
  354.         cp key_esc
  355.         jp nz,mainloop;waitkey
  356.  
  357.         endif
  358.  
  359.         call swapimer
  360. pgmusic=$+1
  361.         ld a,0
  362.         SETPG16K
  363.         ld hl,0x4008+3 ;stop
  364.         OS_SETMUSIC
  365.         halt
  366.         QUIT
  367.  
  368. curkey
  369.         db 0
  370.  
  371. mousetrackcamera
  372. ;de=delta (d>0: go up) (e>0: go left)
  373. ;out: d=camera dy, e=camera dx
  374.         ld hl,(cameraxm)
  375.         ld c,e
  376.         ld a,c
  377.         rla
  378.         sbc a,a
  379.         ld b,a
  380.         add hl,bc
  381.         ld (cameraxm),hl
  382.         ld hl,(cameraym)
  383.         ld c,d
  384.         ld a,c
  385.         rla
  386.         sbc a,a
  387.         ld b,a
  388.         add hl,bc
  389.         ld (cameraym),hl
  390.         ret
  391.  
  392. notrackcamera
  393. ;out: d=camera dy, e=camera dx
  394.         ld de,0
  395.         ret
  396.  
  397. trackcamera
  398. ;de=delta (d>0: go up) (e>0: go left)
  399. ;out: d=camera dy, e=camera dx
  400. ;двигаем смещение камеры к идеалу (xspeed16;yspeed16), но не быстрее, чем на +-CAMERASHIFTSPEED
  401. ;и находим camerax/ymideal
  402. cameraxshift=$+1
  403.         ld hl,0
  404.         ld de,(objects+obj.xspeed16)
  405.         xor a
  406.         sbc hl,de
  407.         or h
  408.         jp m,xshifttoideal_neg
  409. ;hl=xshift-xshiftideal >=0
  410.         ld bc,CAMERASHIFTSPEED_X
  411.         sbc hl,bc
  412.         jr c,xshifttoideal_get ;не быстрее, чем на +CAMERASHIFTSPEED_X
  413.         jr xshifttoideal_limit
  414. xshifttoideal_neg
  415. ;hl=xshift-xshiftideal <0
  416.         ld bc,-CAMERASHIFTSPEED_X
  417.         sbc hl,bc
  418.         jr nc,xshifttoideal_get ;не быстрее, чем на -CAMERASHIFTSPEED_X
  419. xshifttoideal_limit
  420.         ld hl,(cameraxshift)
  421.         or a
  422.         sbc hl,bc
  423.         ex de,hl
  424. xshifttoideal_get
  425.         ex de,hl
  426. xshifttoideal_negq        
  427.         ld (cameraxshift),hl
  428.         ex de,hl
  429.  
  430.         ld hl,+80+24
  431.         ld bc,(objects+obj.x16)
  432.          dup 3
  433.          srl b
  434.          rr c
  435.          edup
  436.         or a
  437.         sbc hl,bc
  438.         ;ld de,(objects+obj.xspeed16)
  439.         or a
  440.         sbc hl,de
  441.         ld (cameraxmideal),hl
  442.  
  443. camerayshift=$+1
  444.         ld hl,0
  445.         ld de,(objects+obj.yspeed16)
  446.         xor a
  447.         sbc hl,de
  448.         or h
  449.         jp m,yshifttoideal_neg
  450. ;hl=yshift-yshiftideal >=0
  451.         ld bc,CAMERASHIFTSPEED_Y
  452.         sbc hl,bc
  453.         jr c,yshifttoideal_get ;не быстрее, чем на +CAMERASHIFTSPEED_Y
  454.         jr yshifttoideal_limit
  455. yshifttoideal_neg
  456. ;hl=yshift-yshiftideal <0
  457.         ld bc,-CAMERASHIFTSPEED_Y
  458.         sbc hl,bc
  459.         jr nc,yshifttoideal_get ;не быстрее, чем на -CAMERASHIFTSPEED_Y
  460. yshifttoideal_limit
  461.         ld hl,(camerayshift)
  462.         or a
  463.         sbc hl,bc
  464.         ex de,hl
  465. yshifttoideal_get
  466.         ex de,hl
  467. yshifttoideal_negq        
  468.         ld (camerayshift),hl
  469.         ex de,hl
  470.  
  471.         ld hl,+80+48
  472.         ld bc,(objects+obj.y16)
  473.          dup 3
  474.          srl b
  475.          rr c
  476.          edup
  477.         or a
  478.         sbc hl,bc
  479.         ;ld de,(objects+obj.yspeed16)
  480.         or a
  481.         sbc hl,de
  482.         ld (cameraymideal),hl
  483.        
  484. ;двигаем камеру к идеалу, но не быстрее, чем на +-CAMERATRACKINGSPEED
  485.         ld hl,(cameraxm)
  486. cameraxmideal=$+1
  487.         ld de,0;(cameraxmideal)
  488.         xor a
  489.         sbc hl,de
  490.         or h
  491.         jp m,xmtoideal_neg
  492. ;hl=xm-xmideal >=0
  493.         ld bc,CAMERATRACKINGSPEED_X
  494.         sbc hl,bc
  495.         jr c,xmtoideal_get ;не быстрее, чем на +CAMERATRACKINGSPEED_X
  496.         jr xmtoideal_limit
  497. xmtoideal_neg
  498. ;hl=xm-xmideal <0
  499.         ld bc,-CAMERATRACKINGSPEED_X
  500.         sbc hl,bc
  501.         jr nc,xmtoideal_get ;не быстрее, чем на -CAMERATRACKINGSPEED_X
  502. xmtoideal_limit
  503.         ld hl,(cameraxm)
  504.         or a
  505.         sbc hl,bc
  506.         ex de,hl
  507. xmtoideal_get
  508.         ex de,hl
  509. xmtoideal_negq        
  510.         ld (cameraxm),hl
  511. cameraxmold=$+1
  512.         ld de,0
  513.         ld (cameraxmold),hl
  514.         or a
  515.         sbc hl,de ;camera dx
  516.        push hl
  517.  
  518.         ld hl,(cameraym)
  519. cameraymideal=$+1
  520.         ld de,0;(cameraymideal)
  521.         xor a
  522.         sbc hl,de
  523.         or h
  524.         jp m,ymtoideal_neg
  525. ;hl=ym-ymideal >=0
  526.         ld bc,CAMERATRACKINGSPEED_Y
  527.         sbc hl,bc
  528.         jr c,ymtoideal_get ;не быстрее, чем на +CAMERATRACKINGSPEED_Y
  529.         jr ymtoideal_limit
  530. ymtoideal_neg
  531. ;hl=ym-ymideal <0
  532.         ld bc,-CAMERATRACKINGSPEED_Y
  533.         sbc hl,bc
  534.         jr nc,ymtoideal_get ;не быстрее, чем на -CAMERATRACKINGSPEED_Y
  535. ymtoideal_limit
  536.         ld hl,(cameraym)
  537.         or a
  538.         sbc hl,bc
  539.         ex de,hl
  540. ymtoideal_get
  541.         ex de,hl
  542. ymtoideal_negq        
  543.         ld (cameraym),hl
  544. cameraymold=$+1
  545.         ld de,0
  546.         ld (cameraymold),hl
  547.         or a
  548.         sbc hl,de ;camera dy
  549.        
  550.        pop bc ;camera dx
  551.          ld d,l
  552.          ld e,c
  553.         ret
  554.  
  555. objectslogic
  556.         ld a,(pgmetatilemap)
  557.         SETPG32KHIGH
  558.  
  559.         ld ix,objects
  560. objectslogic0
  561.         ld a,(ix+obj.y16+1)
  562.         cp DELETEDYHIGH
  563.         jp z,objectslogic0_skip
  564.  
  565.         ld l,(ix+obj.animaddr16+0)
  566.         ld h,(ix+obj.animaddr16+1)
  567.         ld e,(hl)
  568.         inc hl
  569.         ld d,(hl) ;de = phase
  570.         inc hl
  571.         dec (ix+obj.animtime)
  572.         jr nz,logic_nonextphase
  573.         ld a,(hl) ;new animtime
  574.         inc hl
  575.         ld (ix+obj.animtime),a
  576.         ld e,(hl)
  577.         inc hl
  578.         ld d,(hl) ;de = phase
  579.         ld a,d
  580.         cp 0xc0
  581.         jr nc,logic_nocycleanim
  582.         ex de,hl
  583.         ;ld e,(hl)
  584.         inc hl
  585.         ;ld d,(hl) ;de = phase (>=0xc000) or new animaddr (<0xc000)
  586. logic_nocycleanim
  587.         dec hl
  588.         ld (ix+obj.animaddr16+0),l
  589.         ld (ix+obj.animaddr16+1),h
  590. logic_nonextphase
  591.  
  592.         ld l,(ix+obj.xspeed16+0)
  593.         ld h,(ix+obj.xspeed16+1)
  594.         ld e,(ix+obj.x16+0)
  595.         ld d,(ix+obj.x16+1)
  596.         add hl,de
  597.         ld (ix+obj.x16+0),l
  598.         ld (ix+obj.x16+1),h
  599.         ld l,(ix+obj.yspeed16+0)
  600.         ld h,(ix+obj.yspeed16+1)
  601.         inc hl
  602.         inc hl
  603.         inc hl
  604.         inc hl ;gravity
  605.          ld a,h
  606.          rla
  607.          jr c,gravityok
  608.          ld de,8*YSUBPIX8
  609.          or a
  610.          sbc hl,de
  611.          add hl,de
  612.          jr c,gravityok
  613.          ex de,hl
  614. gravityok
  615.         ld (ix+obj.yspeed16+0),l
  616.         ld (ix+obj.yspeed16+1),h
  617.         ex de,hl ;de=yspeed
  618.        
  619.         ld l,(ix+obj.y16+0) ;*YSUBPIX8
  620.         ld h,(ix+obj.y16+1)
  621.         bit 7,(ix+obj.flags)
  622.         jr nz,logic_nocheckfloor
  623. ;check floor
  624.         push de ;yspeed
  625.         push hl ;y
  626.         ld c,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  627.         ld b,(ix+obj.x16+1)
  628.          ld de,32*YSUBPIX8
  629.          add hl,de ;координата прямо под ногами
  630.         call gettile_bycoords
  631.         pop hl ;yspeed
  632.         pop bc ;y
  633.           ;ld c,(ix+obj.y16+0)
  634.           ;ld b,(ix+obj.y16+1)
  635.           add hl,bc
  636.         cp FIRSTSOLIDTILE;32
  637.          res 0,(ix+obj.flags) ;not on floor
  638.         jr c,nofloor
  639.          cp FIRSTOBJTILE
  640.         jr nc,nofloor
  641.          set 0,(ix+obj.flags) ;not on floor
  642. ;выравнивание по y на 16(пикс)*YSUBPIX8
  643.         ld a,l
  644.         and 16*YSUBPIX8;128
  645.         ld l,a
  646.         ld (ix+obj.yspeed16+0),0
  647.         ld (ix+obj.yspeed16+1),0
  648.         jr floorok
  649. nofloor
  650.         push hl ;y16
  651.  
  652.         ld l,(ix+obj.y16+0) ;*YSUBPIX8
  653.         ld h,(ix+obj.y16+1)
  654.         ld c,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  655.         ld b,(ix+obj.x16+1)
  656.          ;ld de,0
  657.          ;add hl,de ;координата прямо в голове
  658.         call gettile_bycoords
  659.         cp FIRSTBETONTILE;64
  660.         pop hl ;y16
  661.         jr c,noceiling
  662. ;выравнивание по y на 16(пикс)*8 вверх
  663.         ld a,l
  664.         or 16*YSUBPIX8-1;127
  665.         ld l,a
  666.         inc hl
  667.         ld (ix+obj.yspeed16+0),0
  668.         ld (ix+obj.yspeed16+1),0        
  669. noceiling
  670. floorok
  671.         jr logic_checkfloorq
  672. logic_nocheckfloor
  673. ;hl=y
  674. ;de=yspeed
  675.         add hl,de
  676.         ld a,h
  677.         cp METATILEMAPHGT*16*YSUBPIX8/256
  678.         jr c,logic_nofalltohell
  679.         ld h,DELETEDYHIGH
  680. logic_nofalltohell
  681. logic_checkfloorq
  682.         ld (ix+obj.y16+0),l
  683.         ld (ix+obj.y16+1),h
  684. objectslogic0_skip
  685.         ld bc,OBJSIZE
  686.         add ix,bc
  687.         bit 7,(ix+obj.y16+1) ;yhigh
  688.         jp z,objectslogic0
  689.         ret
  690.  
  691. bulletslogic
  692.         ld a,(pgmetatilemap)
  693.         SETPG32KHIGH
  694.  
  695.         ld ix,bullets
  696. bulletslogic0
  697.         bit 7,(ix+obj.y16+1) ;yhigh
  698.         ret nz
  699.         ;jr $
  700. ;если health=1, то это мёртвая пуля, этот слот можно использовать
  701.         dec (ix+obj.health)
  702.         jr nz,bulletslogic_noremove
  703.         ld (ix+obj.y16+1),DELETEDYHIGH;0x7f ;yhigh
  704.         inc (ix+obj.health)
  705.         jp bulletslogic_skip        
  706. bulletslogic_noremove
  707.         ld l,(ix+obj.xspeed16+0)
  708.         ld h,(ix+obj.xspeed16+1)
  709.         ld e,(ix+obj.x16+0)
  710.         ld d,(ix+obj.x16+1)
  711.         add hl,de
  712.         ld (ix+obj.x16+0),l
  713.         ld (ix+obj.x16+1),h
  714.  
  715. ;TODO каждый второй фрейм
  716. ENEMYHGT=32*YSUBPIX8
  717. ENEMYWID=16*XSUBPIX8 ;(in double pixels)
  718. BULLETWID=8*XSUBPIX8 ;(in double pixels)
  719. ;TODO учесть размер врага
  720. ;попали, если enemyy<=bullety<=enemyy+ENEMYHGT и enemyx-BULLETWID<=bulletx<=enemyx+ENEMYWID
  721.          ;<--->
  722. ;   |------|
  723.  
  724. ;check enemy
  725.         ld e,(ix+obj.y16+0) ;*YSUBPIX8
  726.         ld d,(ix+obj.y16+1)
  727.         ld c,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  728.         ld b,(ix+obj.x16+1)
  729.         ld a,d
  730.         cp DELETEDYHIGH
  731.         jp z,bulletslogic_checkenemy0q
  732. ;de=bullety
  733. ;bc=bulletx
  734.         exx
  735.         ld bc,OBJSIZE
  736.         exx
  737.         ld iy,objects+obj.sz
  738. bulletslogic_checkenemy0
  739.         bit 7,(iy+obj.y16+1) ;yhigh
  740.         jr nz,bulletslogic_checkenemy0q
  741. ;enemyx-BULLETWID<=bulletx<=enemyx+ENEMYWID
  742. ;-BULLETWID<=bulletx-enemyx<=ENEMYWID
  743. ;-(ENEMYWID+BULLETWID)<=enemyx-bulletx-BULLETWID<=0
  744.         ld l,(iy+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  745.         ld h,(iy+obj.x16+1) ;enemyx
  746.         ;ld a,l
  747.         ;sub BULLETWID
  748.         ;ld l,a
  749.         ;jr nc,$+3
  750.         ;dec h
  751.         or a
  752.         sbc hl,bc ;bc=bulletx
  753.         jr nc,bulletslogic_checkenemy_skip
  754.         ld a,l
  755.         add a,ENEMYWID;+BULLETWID
  756.         ld l,a
  757.         jr nc,bulletslogic_checkenemy_skip
  758.         inc h
  759.         jr nz,bulletslogic_checkenemy_skip
  760. bulletslogic_checkenemy_xok
  761. ;enemyy<=bullety<=enemyy+ENEMYHGT?
  762. ;0<=bullety-enemyy<=ENEMYHGT?
  763. ;-ENEMYHGT<=enemyy-bullety<=0?
  764.         ld l,(iy+obj.y16+0) ;*YSUBPIX8
  765.         ld h,(iy+obj.y16+1) ;enemyy
  766.         or a
  767.         sbc hl,de ;de=bullety
  768.         jr nc,bulletslogic_checkenemy_skip
  769.         ld a,l
  770.         add a,ENEMYHGT-1
  771.         ld l,a
  772.         jr nc,bulletslogic_checkenemy_skip
  773.         inc h
  774.         jr nz,bulletslogic_checkenemy_skip
  775. bulletslogic_checkenemy_yok
  776. ;попали!!!
  777.         ld (ix+obj.y16+1),DELETEDYHIGH ;уничтожаем пулю
  778. ;отнимаем энергию
  779.         ld a,(iy+obj.health)
  780.         sub 10
  781.         ld (iy+obj.health),a
  782.          ld a,9
  783.         jr nc,bulletslogic_enemyfound_notdead
  784.         set 7,(iy+obj.flags) ;dead
  785.         ld (iy+obj.yspeed16+0),-8*YSUBPIX8
  786.         ld (iy+obj.yspeed16+1),-1
  787.         ld (iy+obj.xspeed16+0),2*XSUBPIX8
  788.         ld (iy+obj.xspeed16+1),0
  789.          ld a,10 ;3 перезвяк, 5 диньк, 7 тормоз, 9 миниприз, 10 приз, 11 бум
  790. bulletslogic_enemyfound_notdead
  791.         push bc
  792.         push de
  793.          call sfxplay
  794.         pop de
  795.         pop bc
  796. bulletslogic_checkenemy_skip
  797.         exx
  798.         add iy,bc
  799.         exx
  800.         jr bulletslogic_checkenemy0
  801. bulletslogic_checkenemy0q
  802. ;~check enemy
  803.        
  804. ;check wall
  805.         ld l,(ix+obj.y16+0) ;*YSUBPIX8
  806.         ld h,(ix+obj.y16+1)
  807.           ld c,(ix+obj.yspeed16+0)
  808.           ld b,(ix+obj.yspeed16+1)
  809.           add hl,bc
  810.         push hl
  811.         ld c,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  812.         ld b,(ix+obj.x16+1)
  813.          ld a,c
  814.          ;add a,2*XSUBPIX8
  815.          sub 6*XSUBPIX8
  816.          ld c,a
  817.          ;adc a,b
  818.          ;sub c
  819.          ld a,b
  820.          sbc a,0
  821.          ld b,a
  822.         call gettile_bycoords
  823.         ;inc l
  824.         ;ld a,(hl)
  825.         pop hl
  826.         sub FIRSTBETONTILE;32
  827.         cp FIRSTOBJTILE-FIRSTBETONTILE
  828.         jr nc,bulletslogic_nocrash
  829.         ld h,DELETEDYHIGH ;удалить
  830.         ld (ix+obj.xspeed16+0),0
  831.         ld (ix+obj.xspeed16+1),0
  832.         ld (ix+obj.yspeed16+0),0
  833.         ld (ix+obj.yspeed16+1),0
  834. bulletslogic_nocrash
  835.         ld (ix+obj.y16+0),l
  836.         ld (ix+obj.y16+1),h
  837. bulletslogic_skip
  838.         ld bc,OBJSIZE
  839.         add ix,bc
  840.         jp bulletslogic0
  841.  
  842. fire
  843. genbullet
  844. ;сначала найдём пустые места в списке пуль (т.е. где yhigh==0x7f)
  845. ;если таких нет, то добавляем в конец
  846.         ld iy,bullets
  847. genbullet_findempty0
  848.         bit 7,(iy+obj.y16+1) ;yhigh
  849.         jr nz,genbullet_findempty0q
  850.         ld a,(iy+obj.y16+1) ;yhigh
  851.         cp DELETEDYHIGH
  852.         jr z,genbullet_struct
  853.         ld bc,OBJSIZE
  854.         add iy,bc
  855.         jr genbullet_findempty0
  856. genbullet_findempty0q
  857.         ;jr $
  858. curbulletlistend=$+2
  859.         ld iy,bullets
  860.         push iy
  861.         ld de,-bulletlistend
  862.         add iy,de
  863.         pop iy
  864.         ret c ;no room
  865.  
  866.         call genbullet_struct
  867.         ld bc,OBJSIZE
  868.         add iy,bc
  869. genbullet_terminate
  870.         ld (curbulletlistend),iy
  871.         ld (iy+obj.y16+1),-1
  872.         ret
  873.  
  874. BULLETSPEED=MAXSPEED ;(in double pixels)
  875. genbullet_struct
  876.          ld a,1 ;3 перезвяк, 5 диньк, 7 тормоз, 9 миниприз, 10 приз, 11 бум
  877.          call sfxplay
  878.          
  879.          ld a,(lastdir) ;0=right
  880.          or a
  881.          ld de,BULLETSPEED;4
  882.          jr z,$+5
  883.          ld de,-BULLETSPEED;4
  884.          ld (iy+obj.xspeed16),e
  885.          ld (iy+obj.xspeed16+1),d
  886.  
  887.          ld de,bulletanim_right
  888.          jr z,$+5
  889.          ld de,bulletanim_left
  890.         ld (iy+obj.animaddr16),e
  891.         ld (iy+obj.animaddr16+1),d
  892.         ld (iy+obj.animtime),1
  893.         ld (iy+obj.health),100
  894.         ld a,(ix+obj.x16)
  895.         add a,4*XSUBPIX8
  896.         ld (iy+obj.x16),a
  897.         ld a,(ix+obj.x16+1)
  898.         adc a,0
  899.         ld (iy+obj.x16+1),a
  900.         ld a,(ix+obj.y16)
  901.         add a,16*YSUBPIX8
  902.         ld (iy+obj.y16),a
  903.         ld a,(ix+obj.y16+1)
  904.         adc a,0
  905.         ld (iy+obj.y16+1),a
  906.         xor a
  907.         ld (iy+obj.yspeed16),a
  908.         ld (iy+obj.yspeed16+1),a
  909.         ld (iy+obj.flags),a
  910.         ret
  911.        
  912.  
  913. logic
  914.         call objectslogic
  915.         call bulletslogic
  916.         call herocontrol
  917.         ret
  918.        
  919. ;hero control
  920. herocontrol
  921. joystate=$+1
  922. oldjoystate=$+2
  923.         ld bc,0
  924.         ld a,c
  925.         ld (oldjoystate),a
  926.         xor b
  927.         ld b,a
  928. ;bit - button (ZX key)
  929. ;7 - A (A)
  930. ;6 - B (S)
  931. ;5 - Select (Space)
  932. ;4 - Start (Enter)
  933. ;3 - Up (7)
  934. ;2 - Down (6)
  935. ;1 - Left (5)
  936. ;0 - Right (8)
  937.         bit 6,c
  938.         push bc
  939.         call nz,kick
  940.         pop bc
  941.         bit 5,c
  942.         jr z,nofire
  943.         bit 5,b
  944.         jr z,nofire
  945.         push bc
  946.         ld ix,objects
  947.         call fire
  948.         pop bc
  949. nofire
  950.  
  951.         ld ix,objects
  952.         ld l,(ix+obj.xspeed16+0)
  953.         ld h,(ix+obj.xspeed16+1)
  954.         bit 1,c
  955.         jr z,noleft
  956.         ld a,h
  957.         or a
  958.         jp m,nostartrunleft
  959.         ld a,1
  960.         ld (lastdir),a
  961.          ld de,heroanim_runleft
  962.         ld (ix+obj.animaddr16+0),e
  963.         ld (ix+obj.animaddr16+1),d
  964. nostartrunleft
  965.         ld de,-1
  966.         add hl,de
  967.         ld de,-MAXSPEED
  968.         or a
  969.         sbc hl,de
  970.         ld a,h
  971.         add hl,de
  972.         or a
  973.         jr z,leftq
  974.         ex de,hl
  975.         jr leftq
  976. noleft
  977.         bit 0,c
  978.         jr z,noright
  979.         ld a,h
  980.         or a
  981.         jp m,startrunright
  982.         or l
  983.         jr nz,nostartrunright
  984. startrunright
  985.         xor a
  986.         ld (lastdir),a
  987.          ld de,heroanim_runright
  988.         ld (ix+obj.animaddr16+0),e
  989.         ld (ix+obj.animaddr16+1),d
  990. nostartrunright
  991.         ld de,1
  992.         add hl,de
  993.         ld de,MAXSPEED
  994.         or a
  995.         sbc hl,de
  996.         ld a,h
  997.         add hl,de
  998.         or a
  999.         jr nz,leftq
  1000.         ex de,hl
  1001.         jr leftq
  1002. noright
  1003.          bit 0,(ix+obj.flags) ;on floor?
  1004.          jr z,leftq ;не тормозим на лету
  1005.         ld a,h
  1006.         or l
  1007.         ld e,a
  1008.          bit 7,h
  1009.          jr z,$+3
  1010.          inc hl
  1011.          sra h
  1012.          rr l
  1013.          ld a,h
  1014.          or l
  1015.          jr nz,leftq
  1016.          ld a,e
  1017.          or a
  1018.          jr z,leftq ;уже стояли
  1019. lastdir=$+1
  1020.          ld a,0 ;/1
  1021.          or a
  1022.          ld de,heroanim_standright
  1023.          jr z,$+5
  1024.          ld de,heroanim_standleft
  1025.         ld (ix+obj.animaddr16+0),e
  1026.         ld (ix+obj.animaddr16+1),d
  1027. leftq
  1028.         ld (ix+obj.xspeed16+0),l
  1029.         ld (ix+obj.xspeed16+1),h
  1030. ;проверить, что не въехали в стену в текущем направлении и отскочить
  1031.        push bc
  1032.         bit 7,h
  1033.         jp nz,checkleftwall
  1034.         ld l,(ix+obj.y16+0) ;*YSUBPIX8
  1035.         ld h,(ix+obj.y16+1)
  1036.         ld c,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  1037.         ld b,(ix+obj.x16+1)
  1038.          ld de,16*YSUBPIX8
  1039.          add hl,de ;координата на уровне пояса
  1040.         call gettile_bycoords
  1041.         dec l
  1042.         ld a,(hl) ;правее центра
  1043.         cp FIRSTBETONTILE;64
  1044.         jp c,checkleftwallq ;not beton
  1045.          cp FIRSTOBJTILE
  1046.          jr nc,checkwall_obj
  1047. ;врезались справа, выравниваем x = (x&0xf0) - 1
  1048.          ld de,heroanim_standright
  1049.         ld (ix+obj.animaddr16+0),e
  1050.         ld (ix+obj.animaddr16+1),d
  1051.          ld (ix+obj.xspeed16+0),0
  1052.          ld (ix+obj.xspeed16+1),0
  1053.         ld l,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  1054.         ld h,(ix+obj.x16+1)
  1055.         ld a,l
  1056.         and -8*XSUBPIX8
  1057.         ld l,a
  1058.         dec hl
  1059.         ld (ix+obj.x16+0),l ;*XSUBPIX8 (in double pixels)
  1060.         ld (ix+obj.x16+1),h        
  1061.         jp checkleftwallq
  1062. checkwall_obj
  1063.         ld (hl),0
  1064.         ex de,hl
  1065.         push de
  1066.          ld a,3 ;3 перезвяк, 5 диньк, 7 тормоз, 9 миниприз, 10 приз, 11 бум
  1067.          call sfxplay
  1068.         pop de
  1069.        
  1070.         ;call uvscroll_filltilemap
  1071.         call countmetatilemap ;hl=metatilemap + (yscroll/16*METATILEMAPWID) + (x2scroll/8)
  1072. ;de=тайл, который мы только что изменили
  1073. ;мы должны пропустить по y ровно столько строчек, чтобы hl пересёк тот тайл, который мы только что изменили
  1074.  
  1075.         ld a,d
  1076.         sub h ;a=y
  1077.         cp TILEMAPHGT/2
  1078.         jr nc,getobjnofill
  1079.        
  1080.         ;ld a,3 ;y по умолчанию
  1081.        
  1082.         ;push af
  1083.         ;add a,h
  1084.         ;ld h,a ;hl=metatilemap+
  1085.         ;pop af
  1086.         ld h,d
  1087.         push af ;y
  1088.        
  1089.         ex de,hl
  1090.         ld hl,TILEMAP
  1091.         ld bc,TILEMAPWID*2
  1092.         or a
  1093.         jr z,getobjfill0q
  1094. getobjfill0
  1095.         add hl,bc
  1096.         dec a
  1097.         jr nz,getobjfill0
  1098. getobjfill0q
  1099.         ex de,hl
  1100.         call uvscroll_filltilemap_line
  1101.        
  1102.         ;call uvscroll_showtilemap
  1103.         call uvscroll_showtilemap_counthlde
  1104.         pop af ;y
  1105.         or a
  1106.         jr z,getobjshow0q
  1107.         ld b,a
  1108. getobjshow0
  1109.         push bc
  1110.         ld bc,16*(UVSCROLL_WID/512)
  1111.         add hl,bc ;y*(UVSCROLL_WID/512) ;allscroll+...
  1112.         ex de,hl
  1113.         ld bc,TILEMAPWID*2
  1114.         add hl,bc ;tilemap+...
  1115.         ex de,hl
  1116.         pop bc
  1117.         djnz getobjshow0
  1118. getobjshow0q
  1119.         ld b,1
  1120.         call uvscroll_showtilemap_b
  1121. getobjnofill
  1122.         jr checkleftwallq
  1123. checkleftwall
  1124.         ld l,(ix+obj.y16+0) ;*YSUBPIX8
  1125.         ld h,(ix+obj.y16+1)
  1126.         ld c,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  1127.         ld b,(ix+obj.x16+1)
  1128.          ld de,16*YSUBPIX8
  1129.          add hl,de ;координата на уровне пояса
  1130.         call gettile_bycoords
  1131.         inc l
  1132.         ld a,(hl) ;левее центра
  1133.         cp FIRSTBETONTILE;64
  1134.         jr c,checkleftwallq ;not beton
  1135.          cp FIRSTOBJTILE
  1136.          jr nc,checkwall_obj
  1137. ;врезались слева, выравниваем x = (x+15)&0xf0
  1138.          ld de,heroanim_standleft
  1139.         ld (ix+obj.animaddr16+0),e
  1140.         ld (ix+obj.animaddr16+1),d
  1141.          ld (ix+obj.xspeed16+0),0
  1142.          ld (ix+obj.xspeed16+1),0
  1143.         ld l,(ix+obj.x16+0) ;*XSUBPIX8 (in double pixels)
  1144.         ld h,(ix+obj.x16+1)
  1145.         ld bc,8*XSUBPIX8-1
  1146.         add hl,bc
  1147.         ld a,l
  1148.         and -8*XSUBPIX8
  1149.         ld l,a
  1150.         ld (ix+obj.x16+0),l ;*XSUBPIX8 (in double pixels)
  1151.         ld (ix+obj.x16+1),h
  1152.  
  1153. checkleftwallq
  1154.        pop bc
  1155.  
  1156.         ld l,(ix+obj.yspeed16+0)
  1157.         ld h,(ix+obj.yspeed16+1)
  1158.         bit 7,c
  1159.         jr z,nojump
  1160.         bit 7,b
  1161.         jr z,nojump ;не изменилась кнопка
  1162.        
  1163. ;check floor
  1164.         bit 0,(ix+obj.flags) ;on floor
  1165.         jr z,nojump
  1166.  
  1167.         ld hl,-60
  1168.         ld (ix+obj.yspeed16+0),l
  1169.         ld (ix+obj.yspeed16+1),h
  1170.         ld e,(ix+obj.y16+0)
  1171.         ld d,(ix+obj.y16+1)
  1172.         add hl,de
  1173.         ld (ix+obj.y16+0),l
  1174.         ld (ix+obj.y16+1),h
  1175.        
  1176.        
  1177. nojump
  1178.  
  1179.         ret
  1180.  
  1181. KICKDIST_X=8*XSUBPIX8
  1182. KICKDIST_Y=32*YSUBPIX8
  1183. kick
  1184. ;герой толкает ближайшего врага
  1185.         ld ix,objects
  1186.         ld l,(ix+obj.x16+0)
  1187.         ld h,(ix+obj.x16+1)
  1188.         ld e,(ix+obj.y16+0)
  1189.         ld d,(ix+obj.y16+1)
  1190.        
  1191.         ld ix,objects+OBJSIZE
  1192. kick0
  1193.         bit 7,(ix+obj.y16+1) ;yhigh
  1194.         ret nz
  1195.         push de
  1196.         push hl
  1197.         ld c,(ix+obj.x16+0)
  1198.         ld b,(ix+obj.x16+1)
  1199.         or a
  1200.         sbc hl,bc
  1201.         ld bc,KICKDIST_X
  1202.         add hl,bc
  1203.         ld bc,KICKDIST_X*2
  1204.         or a
  1205.         sbc hl,bc
  1206.         jr nc,kick_xskip
  1207.         ex de,hl
  1208.         ld c,(ix+obj.y16+0)
  1209.         ld b,(ix+obj.y16+1)
  1210.         or a
  1211.         sbc hl,bc
  1212.         ld bc,KICKDIST_Y
  1213.         add hl,bc
  1214.         ld bc,KICKDIST_Y*2
  1215.         or a
  1216.         sbc hl,bc
  1217.         jr nc,kick_xskip
  1218.          ld a,11 ;3 перезвяк, 5 диньк, 7 тормоз, 9 миниприз, 10 приз, 11 бум
  1219.          call sfxplay
  1220.         pop hl
  1221.         pop de
  1222.         ld (ix+obj.yspeed16+0),-80
  1223.         ld (ix+obj.yspeed16+1),-1
  1224.         ld (ix+obj.xspeed16+0),8
  1225.         ld (ix+obj.xspeed16+1),0
  1226.         ret
  1227. kick_xskip
  1228.         pop hl
  1229.         pop de
  1230.  
  1231.         ld bc,OBJSIZE
  1232.         add ix,bc
  1233.         jp kick0
  1234.  
  1235. gettile_bycoords
  1236.         dup 3
  1237.         srl h
  1238.         rr l
  1239.         edup
  1240.         dup 4
  1241.         add hl,hl
  1242.         edup
  1243.         dup 3
  1244.         srl b
  1245.         rr c
  1246.         edup
  1247.         dup 3
  1248.         srl b
  1249.         rr c
  1250.         edup
  1251.         ld a,c
  1252.          sub 3
  1253.         cpl
  1254.         ld l,a
  1255.         ld a,h
  1256.          sub 3 ;проверять будем тайл в ногах, а не в голове
  1257.         cpl
  1258.         ld h,a
  1259.         ld a,(hl) ;tile в ногах
  1260.         ret
  1261.  
  1262.         if OLDDRAWSPR==1
  1263. drawsprites
  1264. pg1=$+1
  1265.         ld a,0
  1266.         call setpgc000
  1267. drawsprites0      
  1268.         bit 7,(ix+obj.y16+1) ;yhigh
  1269.         jp nz,setpgsmain40008000
  1270.  
  1271.         ld l,(ix+obj.animaddr16+0)
  1272.         ld h,(ix+obj.animaddr16+1)
  1273.         ld e,(hl)
  1274.         inc hl
  1275.         ld d,(hl) ;de = phase
  1276.  
  1277.         ;ld l,(ix+obj.spraddr16+0)
  1278.         ;ld h,(ix+obj.spraddr16+1)
  1279.        
  1280.         ex de,hl
  1281.        
  1282.          ;ld a,2
  1283.          ;add a,0
  1284.          ;ld ($-1),a
  1285.          ;and 2*3
  1286.          ;add a,l
  1287.          ;ld l,a
  1288.         ld (drawsprites0_sprdescr),hl
  1289.         call setpgsscr40008000 ;предыдущий спрайт мог выключить, если был левее экрана и вообще не попал на экран? ;TODO если спрайт в границах экрана
  1290. drawsprites0_sprdescr=$+2
  1291.         ld iy,(0xc000);testspr
  1292.  
  1293. ;храним x*XSUBPIX8 (in double pixels),y*YSUBPIX8
  1294.         ld a,(ix+obj.x16+0)
  1295.         ld d,(ix+obj.x16+1)
  1296.         srl d
  1297.         rra
  1298.         srl d
  1299.         rra
  1300.         srl d
  1301.         rra
  1302.         ld e,a
  1303.        
  1304. cameraxm=$+1
  1305.         ld hl,0;+160;-2048+160
  1306.         add hl,de
  1307.          ;jr $
  1308.         ld a,h
  1309.         or a
  1310.         jr nz,drawspr_skip
  1311.         ld a,l
  1312.         cp 159+sprmaxwid
  1313.         jr nc,drawspr_skip
  1314.         ;sub sprmaxwid-1
  1315.         ld e,a
  1316.        
  1317.         ld a,(ix+obj.y16+0)
  1318.         ld b,(ix+obj.y16+1)
  1319.         srl b
  1320.         rra
  1321.         srl b
  1322.         rra
  1323.         srl b
  1324.         rra
  1325.         ld c,a
  1326. cameraym=$+1
  1327.         ld hl,0;+160;-1024+160
  1328.         add hl,bc
  1329.         ld a,h
  1330.         or a
  1331.         jr nz,drawspr_skip
  1332.         ld a,l
  1333.         cp 199+sprmaxhgt
  1334.         jr nc,drawspr_skip
  1335.         sub sprmaxhgt-1
  1336.         ld c,a
  1337.  
  1338. ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  1339. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1340.  
  1341.         push ix
  1342.         ;call prsprega ;(с включением экранных страниц и проверкой попадания спрайта в экран) один спрайт 16x16 = 6875t
  1343.         call prspr ;(без включения экранных страниц и без проверки попадания спрайта в экран) один спрайт 16x16 = 6408t (из них 4224t само мясо)
  1344.         pop ix
  1345. drawspr_skip
  1346.  
  1347.         ld bc,OBJSIZE
  1348.         add ix,bc
  1349.         jp drawsprites0
  1350. ;817000(prsprega)/793000(prspr)t на всё
  1351.         endif
  1352.  
  1353.         if OLDDRAWSPR==0
  1354. preparedrawsprites
  1355. ;pg1=$+1
  1356.         ld a,(pg1) ;страница описателей спрайтов
  1357.         call setpgc000
  1358. preparedrawsprites0
  1359.         bit 7,(ix+obj.y16+1) ;yhigh
  1360.         ret nz ;jp nz,preparedrawspritesq ;setpgsmain40008000
  1361.  
  1362. ;храним x*XSUBPIX8 (in double pixels),y*YSUBPIX8
  1363.         ld a,(ix+obj.x16+0)
  1364.         ld b,(ix+obj.x16+1)
  1365.         srl b
  1366.         rra
  1367.         srl b
  1368.         rra
  1369.         srl b
  1370.         rra
  1371.         ld c,a
  1372. cameraxm=$+1
  1373.         ld hl,0;+160;-2048+160
  1374.         add hl,bc
  1375.         ld a,h
  1376.         or a
  1377.         jr nz,preparedrawspr_skip
  1378.         ld a,l
  1379.         cp 159+sprmaxwid
  1380.         jr nc,preparedrawspr_skip
  1381.         ;ld e,a
  1382.          ld (de),a ;x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  1383.        
  1384.         ld a,(ix+obj.y16+0)
  1385.         ld b,(ix+obj.y16+1)
  1386.         srl b
  1387.         rra
  1388.         srl b
  1389.         rra
  1390.         srl b
  1391.         rra
  1392.         ld c,a
  1393. cameraym=$+1
  1394.         ld hl,0;+160;-1024+160
  1395.         add hl,bc
  1396.         ld a,h
  1397.         or a
  1398.         jr nz,preparedrawspr_skip
  1399.         ld a,l
  1400.         cp 199+sprmaxhgt
  1401.         jr nc,preparedrawspr_skip
  1402.         sub sprmaxhgt-1
  1403.         ;ld c,a
  1404.          inc de
  1405.          ld (de),a ;y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1406.          inc de
  1407.         ld l,(ix+obj.animaddr16+0)
  1408.         ld h,(ix+obj.animaddr16+1)
  1409.         ld a,(hl) ;phase LSB
  1410.         inc hl
  1411.         ld h,(hl) ;phase HSB
  1412.         ld l,a
  1413.          ldi
  1414.          ldi
  1415.  
  1416.         ld a,(ix+obj.animaddr16+0) ;TODO
  1417. pg1=$+1
  1418.         ld a,0
  1419.          ld (de),a ;pg
  1420.          inc de
  1421. preparedrawspr_skip
  1422.         ld bc,OBJSIZE
  1423.         add ix,bc
  1424.         jp preparedrawsprites0
  1425. ;817000(prsprega)/793000(prspr)t на всё
  1426. ;preparedrawspritesq
  1427. ;        dec de
  1428. ;        ld (drawsprites_data),de
  1429. ;        ret ;jp setpgsmain40008000
  1430.  
  1431.         ;ld iy,(0xc000);testspr
  1432.         ;ld e,110+(sprmaxwid-1) ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  1433.         ;ld c,120 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1434.         ;call prsprega
  1435.  
  1436.         align 256
  1437. spritesA
  1438.         ds 1+5*51
  1439.         align 256
  1440. spritesB
  1441.         ds 1+5*51
  1442.         align 256
  1443. spritesC
  1444.         ds 1+5*51
  1445.  
  1446. drawsprites
  1447. ;y,x,addr,pg - читаем с конца
  1448. drawsprites_data=$+1
  1449.         ld hl,0;sprlistA/B/C
  1450.         ;jr $
  1451.         inc l
  1452.         dec l
  1453.         ret z ;no sprites
  1454. drawsprites0
  1455.         call setpgsscr40008000 ;предыдущий спрайт мог выключить, если был левее экрана и вообще не попал на экран? ;TODO если спрайт в границах экрана
  1456.         ld a,(hl)
  1457.         dec hl
  1458.         call setpgc000
  1459.         ld a,(hl)
  1460.         ld hy,a
  1461.         dec hl
  1462.         ld a,(hl)
  1463.         ld ly,a
  1464.         dec hl
  1465.         ld c,(hl) ;y
  1466.         dec hl
  1467.         ld e,(hl) ;x
  1468.         push hl
  1469. ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  1470. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1471.         call prspr ;(без включения экранных страниц и без проверки попадания спрайта в экран) один спрайт 16x16 = 6408t (из них 4224t само мясо)
  1472.         pop hl
  1473.         dec l
  1474.         jp nz,drawsprites0
  1475.         jp setpgsmain40008000
  1476.  
  1477.         endif
  1478.  
  1479. getmousedelta
  1480.         GET_KEY ;OS_GETKEYNOLANG
  1481.         ld a,c ;keynolang
  1482.         ;ld (key),a
  1483.          jr nz,control_nofocus
  1484. control_imer_oldmousecoords=$+1
  1485.         ld bc,0
  1486.         ld (control_imer_oldmousecoords),de
  1487.         ld a,d;b
  1488.         sub b;d
  1489.         ld d,a
  1490.         ld a,c;e
  1491.         sub e;c
  1492.         ld e,a
  1493. control_nofocus
  1494.         ;ld (control_imer_mousecoordsdelta),de
  1495.         ret
  1496.  
  1497. loadpage
  1498. ;заказывает страничку и грузит туда файл (имя файла в hl)
  1499. ;out: hl=после имени файла, a=pg
  1500.         push hl
  1501.         OS_NEWPAGE
  1502.         pop hl
  1503.         ld a,e
  1504.         push af ;pg
  1505.         call setpgc000;SETPG32KHIGH
  1506.         push hl
  1507.         ex de,hl
  1508.         OS_OPENHANDLE
  1509.         push bc
  1510.         ld de,0xc000 ;addr
  1511.         ld hl,0x4000 ;size
  1512.         OS_READHANDLE
  1513.         pop bc
  1514.         OS_CLOSEHANDLE                
  1515.         pop hl
  1516.         ld b,1
  1517.         xor a
  1518.         cpir ;after 0
  1519.         pop af ;pg
  1520.         ret
  1521.  
  1522.         include "pal.ast"
  1523. ;SUMMERPAL
  1524. ;DDp palette: %grbG11RB(low),%grbG11RB(high), инверсные
  1525.         ;dw 0xffff,0xfefe,0x1d1d,0x3c3c,0xcdcd,0x4c4c,0x2c2c,0xecec
  1526.         ;dw 0xfdfd,0x2d2d,0xeeee,0x3f3f,0xafaf,0x5d5d,0x4e4e,0x0c0c
  1527. ;RSTPAL
  1528. ;        STANDARDPAL
  1529.  
  1530.  
  1531. texfilename
  1532.         ;db "WBAR.bin",0
  1533.         db "WHUM1.bin",0
  1534.         db "sfx.bin",0
  1535.         db "music.bin",0
  1536.  
  1537. primgega
  1538. ;b=hgt,c=wid (/2)
  1539. ;de=gfx
  1540. ;hl=scr
  1541.         push bc
  1542.         call setpgsscr40008000
  1543.         pop bc
  1544. primgega0
  1545.         push bc
  1546.         ld hx,b
  1547.         push hl
  1548.         ld bc,40
  1549. primgegacolumn0
  1550.         ld a,(de)
  1551.         inc de
  1552.         ld (hl),a
  1553.         add hl,bc
  1554.         dec hx
  1555.         jr nz,primgegacolumn0
  1556.         pop hl
  1557.         ld a,0x9f;0xa0
  1558.         cp h
  1559.         ld bc,0x4000
  1560.         adc hl,bc
  1561.         jp pe,primgegacolumn0q ;в половине случаев
  1562. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  1563.          inc a
  1564.         xor h
  1565.         ld h,a
  1566. primgegacolumn0q
  1567.         pop bc
  1568.         dec c
  1569.         jr nz,primgega0
  1570.         jp setpgsmain40008000
  1571.        
  1572. prsprega
  1573. ;iy=spr (+4)
  1574. ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  1575. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1576.         push bc
  1577.         call setpgsscr40008000
  1578.         pop bc      
  1579.         ld a,e
  1580.         cp scrwid+(sprmaxwid-1)
  1581.         jr nc,noprspr
  1582.         ld a,c
  1583.         add a,sprmaxhgt-1
  1584.         cp scrhgt+(sprmaxhgt-1)
  1585.         call c,prspr
  1586. noprspr
  1587.         ;jp setpgsmain40008000
  1588.  
  1589. setpgsmain40008000
  1590. pgmain4000=$+1
  1591.         ld a,0
  1592.         ;ld (curpg4000),a
  1593.         SETPG16K
  1594. pgmain8000=$+1
  1595.         ld a,0
  1596.         ;ld (curpg8000),a
  1597.         SETPG32KLOW
  1598.         ret
  1599.  
  1600. setpgsscr40008000_current
  1601.         call getuser_scr_low_cur
  1602.         ;ld (curpg4000),a ;TODO kill
  1603.         SETPG16K
  1604.         call getuser_scr_high_cur
  1605.         ;ld (curpg8000),a ;TODO kill
  1606.         SETPG32KLOW
  1607.         ret
  1608.  
  1609. setpgsscr40008000
  1610.         call getuser_scr_low
  1611.         ;ld (curpg4000),a ;TODO kill
  1612.         SETPG16K
  1613.         call getuser_scr_high
  1614.         ;ld (curpg8000),a ;TODO kill
  1615.         SETPG32KLOW
  1616.         ret
  1617.  
  1618. setpgscrlow4000
  1619.         call getuser_scr_low
  1620.         SETPG16K
  1621.         ret
  1622.  
  1623. setpgscrhigh4000
  1624.         call getuser_scr_high
  1625.         SETPG16K
  1626.         ret
  1627.  
  1628. getuser_scr_low
  1629. getuser_scr_low_patch=$+1
  1630. getuser_scr_low_patchN=0xff&(user_scr0_low^user_scr1_low)
  1631.         ld a,(user_scr1_low) ;ok
  1632.         ret
  1633.  
  1634. getuser_scr_high
  1635. getuser_scr_high_patch=$+1
  1636. getuser_scr_high_patchN=0xff&(user_scr0_high^user_scr1_high)
  1637.         ld a,(user_scr1_high) ;ok
  1638.         ret
  1639.  
  1640. getuser_scr_low_cur
  1641. getuser_scr_low_cur_patch=$+1
  1642. getuser_scr_low_cur_patchN=0xff&(user_scr0_low^user_scr1_low)
  1643.         ld a,(user_scr0_low) ;ok
  1644.         ret
  1645.  
  1646. getuser_scr_high_cur
  1647. getuser_scr_high_cur_patch=$+1
  1648. getuser_scr_high_cur_patchN=0xff&(user_scr0_high^user_scr1_high)
  1649.         ld a,(user_scr0_high) ;ok
  1650.         ret
  1651.  
  1652. changescrpg_current
  1653. ;        ld a,(setpgs_scr_low)
  1654. ;setpgs_scr_scrxor=$+1
  1655. ;        xor 0
  1656. ;        ld (setpgs_scr_low),a
  1657.         ld hl,getuser_scr_low_patch
  1658.         ld a,(hl)
  1659.         xor getuser_scr_low_patchN
  1660.         ld (hl),a
  1661.         ld hl,getuser_scr_high_patch
  1662.         ld a,(hl)
  1663.         xor getuser_scr_high_patchN
  1664.         ld (hl),a
  1665.         ld hl,getuser_scr_low_cur_patch
  1666.         ld a,(hl)
  1667.         xor getuser_scr_low_cur_patchN
  1668.         ld (hl),a
  1669.         ld hl,getuser_scr_high_cur_patch
  1670.         ld a,(hl)
  1671.         xor getuser_scr_high_cur_patchN
  1672.         ld (hl),a
  1673.  
  1674.         ld a,1
  1675. curscrnum=$+1
  1676.         xor 0
  1677.         ld ($-1),a
  1678.         ret
  1679.        
  1680. changescrpg
  1681.         ;jr $
  1682.         call changescrpg_current
  1683.         ld (curscrnum_int),a
  1684.         ;ld e,a
  1685.         ;OS_SETSCREEN
  1686.         ret
  1687.        
  1688. setpgc000
  1689.         ;ld (curpgc000),a
  1690.         SETPG32KHIGH
  1691.         ret
  1692.  
  1693.         include "sprdata.asm"
  1694.  
  1695. sfxplay
  1696.         push af
  1697. pgsfx=$+1
  1698.         ld a,0
  1699.         SETPG32KLOW
  1700.         pop af
  1701.         jp 0x8000 ;SFXPLAY
  1702.  
  1703. importcoords
  1704.         ld de,enemymapfilename
  1705.         OS_OPENHANDLE
  1706.         ld de,objects
  1707.         ld hl,MAXOBJECTS*3
  1708.         push bc
  1709.         OS_READHANDLE
  1710.         pop bc
  1711.         push hl ;size
  1712.         OS_CLOSEHANDLE
  1713.         pop bc
  1714. ;bc=size
  1715.         ld hl,objects-1
  1716.         add hl,bc
  1717.         ld de,endobjects-1
  1718.         push bc
  1719.         lddr
  1720.         pop bc
  1721.         inc de
  1722.         ex de,hl ;hl=начало данных: type, x, y
  1723.         ld ix,objects+OBJSIZE ;героя перебросим отдельно
  1724. importcoords0        
  1725.         ld a,(hl) ;type
  1726.         cp TYPE_HERO
  1727.         jr nz,importcoords_nhero
  1728.         push ix
  1729.         ld ix,objects
  1730.         ld de,heroanim_standright
  1731.         ld (ix+obj.animaddr16),e
  1732.         ld (ix+obj.animaddr16+1),d
  1733.         ld (ix+obj.animtime),1
  1734.         ld (ix+obj.health),100
  1735.         call fillobjxy
  1736.         pop ix
  1737.         jr importcoords_nheroq
  1738. importcoords_nhero
  1739.         ;TODO anim from type
  1740.         ld de,heroanim_runright
  1741.         ld (ix+obj.animaddr16),e
  1742.         ld (ix+obj.animaddr16+1),d
  1743.         ld (ix+obj.animtime),1
  1744.         ;TODO health from type
  1745.         ld (ix+obj.health),19
  1746.         call fillobjxy
  1747.         ld de,OBJSIZE
  1748.         add ix,de
  1749. importcoords_nheroq
  1750.         inc hl
  1751.         dec bc
  1752.         dec bc
  1753.         dec bc
  1754.         ld a,b
  1755.         or c
  1756.         jr nz,importcoords0
  1757.         ld (ix),0xff
  1758.         ld (ix+1),0xff
  1759.         ret
  1760.  
  1761. fillobjxy
  1762. ;hl=указатель на type, x, y
  1763. ;ix=obj
  1764.         inc hl
  1765.         ld a,(hl)
  1766.         add a,3
  1767.         ld d,0
  1768.         dup 3+3
  1769.         add a,a
  1770.         rl d
  1771.         edup
  1772.         ld e,a
  1773.         ld (ix+obj.x16),e
  1774.         ld (ix+obj.x16+1),d
  1775.         inc hl
  1776.         ld a,(hl)
  1777.         ld d,0
  1778.         dup 4+3
  1779.         add a,a
  1780.         rl d
  1781.         edup
  1782.         ld e,a
  1783.         ld (ix+obj.y16),e
  1784.         ld (ix+obj.y16+1),d
  1785.         xor a
  1786.         ld (ix+obj.xspeed16),a
  1787.         ld (ix+obj.xspeed16+1),a
  1788.         ld (ix+obj.yspeed16),a
  1789.         ld (ix+obj.yspeed16+1),a
  1790.         ld (ix+obj.flags),a
  1791.         ret
  1792.  
  1793.         include "int.asm"
  1794.         include "cls.asm"
  1795.         include "prspr.asm"
  1796.         include "bgpush.asm"
  1797.         include "bgpushxy.asm"
  1798.        
  1799.         include "../../_sdk/file.asm"
  1800.  
  1801. readbmphead_pal
  1802.         ld de,bgpush_bmpbuf
  1803.         ld hl,14+2;54+(4*16)
  1804. ;de=buf
  1805. ;hl=size
  1806.         call readstream_file
  1807.         ld de,bgpush_bmpbuf
  1808.         ld hl,(bgpush_bmpbuf+14)
  1809.         dec hl
  1810.         dec hl
  1811. ;de=buf
  1812. ;hl=size
  1813.         call readstream_file
  1814.         ld de,bgpush_bmpbuf
  1815.         ld hl,+(4*16)
  1816. ;de=buf
  1817. ;hl=size
  1818.         call readstream_file
  1819.  
  1820.         ld hl,bgpush_bmpbuf;+54
  1821.         ld ix,pal
  1822.         ld b,16
  1823. recodepal0
  1824.         ld e,(hl)
  1825.         inc hl
  1826.         ld d,(hl)
  1827.         inc hl
  1828.         push hl
  1829.         ld l,(hl) ;e=B, d=G, l=R
  1830.         call readfile_rgbtopal
  1831.         pop hl
  1832.         inc hl
  1833.         inc hl
  1834.         djnz recodepal0
  1835.         ret
  1836.  
  1837. readfile_rgbtopal
  1838. ;e=B, d=G, l=R
  1839.         call calcRGBtopal_pp
  1840.         ld (ix+1),a
  1841.         call calcRGBtopal_pp
  1842.         ld (ix),a
  1843.         inc ix
  1844.         inc ix
  1845.         ret
  1846.  
  1847. calcRGBtopal_pp
  1848. ;e=B, d=G, l=R
  1849. ;DDp palette: %grbG11RB(low),%grbG11RB(high), ??oN????N
  1850.         xor a
  1851.         rl e  ;B
  1852.         rra
  1853.         rl l  ;R
  1854.         rra
  1855.         rrca
  1856.         rrca
  1857.         rl d  ;G
  1858.         rra
  1859.         rl e  ;b
  1860.         rra
  1861.         rl l  ;r
  1862.         rra
  1863.         rl d  ;g
  1864.         rra
  1865.         cpl
  1866.         ret
  1867.  
  1868. bgpush_ldbmp_line
  1869. ;hl=начало строки ld-push
  1870. ;a=pushwid/2
  1871.         push bc
  1872.         ;push de
  1873.  
  1874.          push af
  1875.         ;push de
  1876.         push hl
  1877.         push ix
  1878.         ld de,bgpush_bmpbuf
  1879.         ld h,0
  1880.         ld l,a
  1881.         add hl,hl
  1882.         add hl,hl
  1883.         add hl,hl
  1884.         add hl,hl
  1885.         ;ld hl,320
  1886. ;de=buf
  1887. ;hl=size
  1888.         push hl
  1889.         push de
  1890.         call readstream_file
  1891.         pop de
  1892.         pop hl
  1893.         add hl,de
  1894.         ex de,hl ;de=gfx end addr
  1895.         pop ix
  1896.         pop hl
  1897.         ;pop de
  1898.          pop bc
  1899.         ;pop af
  1900.         ;ld b,a
  1901.         dec de ;gfx addr
  1902.         ld a,(ix+3)
  1903.         call bgpush_ldbmp_layerline
  1904.         dec de
  1905.         dec de
  1906.         ld a,(ix+2);(ix+1)
  1907.         call bgpush_ldbmp_layerline
  1908.         dec de
  1909.         dec de
  1910.         ld a,(ix+1);(ix+2)
  1911.         call bgpush_ldbmp_layerline        
  1912.         dec de
  1913.         dec de
  1914.         ld a,(ix+0)
  1915.         call bgpush_ldbmp_layerline        
  1916.         ;pop de
  1917.         pop bc
  1918.         ret
  1919.  
  1920. bgpush_ldbmp_layerline
  1921. ;пишем каждый четвёртый байт с конца в ld-push
  1922. ;de=gfx
  1923. ;hl=начало строки ld-push
  1924. ;a=pg
  1925. ;b=pushwid/2
  1926.         ;ld b,pushwid/2
  1927.         push bc
  1928.         SETPG32KLOW;SETPGPUSHBASE
  1929.         pop bc
  1930.         push bc
  1931.         push de
  1932.         push hl
  1933.         ;inc hl
  1934.         ;inc hl ;мы на втором байте первого слова данных в ld bc
  1935. bgpush_ldbmp_bytes0
  1936.         inc hl
  1937.         inc hl
  1938.         RECODEBYTE
  1939.         ld (hl),a
  1940.         dec hl
  1941.          dec de
  1942.          dec de
  1943.          dec de
  1944.          dec de
  1945.          dec de
  1946.          dec de
  1947.         RECODEBYTE
  1948.         ld (hl),a
  1949.         inc hl
  1950.          dec de
  1951.          dec de
  1952.          dec de
  1953.          dec de
  1954.          dec de
  1955.          dec de
  1956.         inc hl
  1957.         inc hl
  1958.         djnz bgpush_ldbmp_bytes0
  1959.         pop hl
  1960.         pop de
  1961.         pop bc
  1962.         ret
  1963.  
  1964. prcoords
  1965.         call setpgsscr40008000
  1966.         ld hl,(cameraxshift)
  1967.         ld de,0x4000 + (192*40)
  1968.         call prnum
  1969.         ld hl,(objects+obj.xspeed16)
  1970.         ld de,0x4008 + (192*40)
  1971.         call prnum
  1972.         ret
  1973.  
  1974. prnum
  1975.         ld bc,10000
  1976.         call prdig
  1977.         ld bc,1000
  1978.         call prdig
  1979.         ld bc,100
  1980.         call prdig
  1981.         ld bc,10
  1982.         call prdig
  1983.         ld bc,1
  1984. prdig
  1985.         ld a,'0'-1
  1986. prdig0
  1987.         inc a
  1988.         or a
  1989.         sbc hl,bc
  1990.         jr nc,prdig0
  1991.         add hl,bc
  1992.         ;push hl
  1993.         ;call prchar
  1994.         ;pop hl
  1995.         ;ret
  1996. prchar
  1997. ;a=code
  1998. ;de=screen
  1999.         push de
  2000.         push hl
  2001.         call prcharin
  2002.         pop hl
  2003.         pop de
  2004.         inc e
  2005.         ret
  2006.        
  2007. calcscraddr
  2008. ;bc=yx
  2009. ;можно портить bc
  2010.         ex de,hl
  2011.         ld a,c ;x
  2012.         ld l,b ;y
  2013.         ld h,0
  2014.         ld b,h
  2015.         ld c,l
  2016.         add hl,hl
  2017.         add hl,hl
  2018.         add hl,bc ;*5
  2019.          add hl,hl
  2020.          add hl,hl
  2021.          add hl,hl ;*40
  2022.          add hl,hl
  2023.          add hl,hl
  2024.          add hl,hl
  2025.         add a,l
  2026.         ld l,a
  2027.         ld a,h
  2028.         adc a,0x40
  2029.         ld h,a
  2030.         ex de,hl
  2031.         ret
  2032.  
  2033. prcharxy
  2034. ;a=code
  2035. ;bc=yx
  2036.         push de
  2037.         push hl
  2038.         push bc
  2039.         push af
  2040.         call calcscraddr
  2041.         pop af
  2042.         call prcharin
  2043.         pop bc
  2044.         pop hl
  2045.         pop de
  2046.         ret
  2047.        
  2048. prcharin
  2049.         sub 32
  2050.         ld l,a
  2051.         ld h,0
  2052.          add hl,hl
  2053.          add hl,hl
  2054.          add hl,hl
  2055.          add hl,hl
  2056.          add hl,hl
  2057.         ;ld bc,font-(32*32)
  2058.         ;add hl,bc
  2059.         ld a,h
  2060.         add a,font/256
  2061.         ld h,a
  2062. prcharin_go
  2063.         ex de,hl
  2064.        
  2065.         ld bc,40
  2066.         push hl
  2067.         push hl
  2068.         dup 8
  2069.         ld a,(de) ;font
  2070.         ld (hl),a ;scr
  2071.         inc de
  2072.         add hl,bc
  2073.         edup
  2074.         pop hl
  2075.         ;set 6,h
  2076.          ld a,h
  2077.          add a,0x40
  2078.          ld h,a
  2079.         ;ld d,font/256
  2080.         dup 8
  2081.         ld a,(de) ;font
  2082.         ld (hl),a ;scr
  2083.         inc de
  2084.         add hl,bc
  2085.         edup
  2086.         pop hl
  2087.         set 5,h
  2088.         push hl
  2089.         ;ld d,font/256
  2090.         dup 8
  2091.         ld a,(de) ;font
  2092.         ld (hl),a ;scr
  2093.         inc de
  2094.         add hl,bc
  2095.         edup
  2096.         pop hl
  2097.         ;set 6,h
  2098.          ld a,h
  2099.          add a,0x40
  2100.          ld h,a
  2101.         ;ld d,font/256
  2102.         dup 8
  2103.         ld a,(de) ;font
  2104.         ld (hl),a ;scr
  2105.         inc de
  2106.         add hl,bc
  2107.         edup        
  2108.         ret
  2109.  
  2110. genpush_newpage
  2111. ;заказывает страницу, заносит в tpushpgs, a=pg
  2112.         push bc
  2113.         push de
  2114.         push hl
  2115.         push ix
  2116.         OS_NEWPAGE
  2117.         pop ix
  2118.         ld a,e
  2119.         ld (ix),a
  2120.         ld de,4
  2121.         add ix,de
  2122.         pop hl
  2123.         pop de
  2124.         pop bc
  2125.         ret
  2126.  
  2127.         align 256
  2128. font
  2129.         incbin "fontgfx"
  2130.        
  2131. res_path
  2132.         db "sprexamp",0 ;в этом относительном пути будут лежать все загружаемые данные игры
  2133. bgfilename
  2134.         db "bg6-16c.bmp",0
  2135. bgxyfilename
  2136.         db "bg8-16d.bmp",0
  2137.  
  2138. tilefilename
  2139.         db "tiles.bin",0
  2140. tilebmpfilename
  2141.         db "tiles1.bmp",0
  2142. tilemapfilename
  2143.         db "map1.map",0
  2144. enemymapfilename
  2145.         db "map1.enm",0
  2146.  
  2147.  
  2148. TILEMAP
  2149.         ds TILEMAPWID*TILEMAPHGT ;снизу вверх, справа налево
  2150.  
  2151. tpushpgs
  2152.         ds 128 ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
  2153.  
  2154.         align 256
  2155. trecodebyteleft
  2156.         dup 256
  2157. ;%00003210 => %.3...210
  2158. _3=$&8
  2159. _210=$&7
  2160.         db (_3*0x08) + (_210*0x01)
  2161.         edup
  2162.        
  2163. trecodebyteright
  2164.         dup 256
  2165. ;%00003210 => %3.210...
  2166. _3=$&8
  2167. _210=$&7
  2168.         db (_3*0x10) + (_210*0x08)
  2169.         edup
  2170.  
  2171. bgpush_bmpbuf=0x4000 ;ds 1024;320 ;заголовок bmp или одна строка
  2172. bgpush_loadbmplinestack=bgpush_bmpbuf+1024 ;ds pushhgt*2+32
  2173.        
  2174. end        
  2175.  
  2176.         display "begin=",begin
  2177.         display "end=",end
  2178.         display "Size ",/d,end-begin," bytes"
  2179.        
  2180.         savebin "sprexamp.com",begin,end-begin
  2181.        
  2182.         LABELSLIST "../../../us/user.l"
  2183.