Subversion Repositories NedoOS

Rev

Rev 660 | Rev 673 | 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=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=0x3b80;0x3f00 ;чтобы не запороть стек загрузки bmp в bgpush
  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
  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
  231.         ld ix,bullets
  232.         call preparedrawsprites
  233.         dec de
  234.         ld (drawsprites_data),de
  235.         call drawsprites
  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
  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==0
  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.         include "../../_sdk/file.asm"
  1799.  
  1800. readbmphead_pal
  1801.         ld de,bgpush_bmpbuf
  1802.         ld hl,14+2;54+(4*16)
  1803. ;de=buf
  1804. ;hl=size
  1805.         call readstream_file
  1806.         ld de,bgpush_bmpbuf
  1807.         ld hl,(bgpush_bmpbuf+14)
  1808.         dec hl
  1809.         dec hl
  1810. ;de=buf
  1811. ;hl=size
  1812.         call readstream_file
  1813.         ld de,bgpush_bmpbuf
  1814.         ld hl,+(4*16)
  1815. ;de=buf
  1816. ;hl=size
  1817.         call readstream_file
  1818.  
  1819.         ld hl,bgpush_bmpbuf;+54
  1820.         ld ix,pal
  1821.         ld b,16
  1822. recodepal0
  1823.         ld e,(hl)
  1824.         inc hl
  1825.         ld d,(hl)
  1826.         inc hl
  1827.         push hl
  1828.         ld l,(hl) ;e=B, d=G, l=R
  1829.         call readfile_rgbtopal
  1830.         pop hl
  1831.         inc hl
  1832.         inc hl
  1833.         djnz recodepal0
  1834.         ret
  1835.  
  1836. readfile_rgbtopal
  1837. ;e=B, d=G, l=R
  1838.         call calcRGBtopal_pp
  1839.         ld (ix+1),a
  1840.         call calcRGBtopal_pp
  1841.         ld (ix),a
  1842.         inc ix
  1843.         inc ix
  1844.         ret
  1845.  
  1846. calcRGBtopal_pp
  1847. ;e=B, d=G, l=R
  1848. ;DDp palette: %grbG11RB(low),%grbG11RB(high), ??oN????N
  1849.         xor a
  1850.         rl e  ;B
  1851.         rra
  1852.         rl l  ;R
  1853.         rra
  1854.         rrca
  1855.         rrca
  1856.         rl d  ;G
  1857.         rra
  1858.         rl e  ;b
  1859.         rra
  1860.         rl l  ;r
  1861.         rra
  1862.         rl d  ;g
  1863.         rra
  1864.         cpl
  1865.         ret
  1866.  
  1867. bgpush_ldbmp_line
  1868. ;hl=начало строки ld-push
  1869. ;a=pushwid/2
  1870.         push bc
  1871.         ;push de
  1872.  
  1873.          push af
  1874.         ;push de
  1875.         push hl
  1876.         push ix
  1877.         ld de,bgpush_bmpbuf
  1878.         ld h,0
  1879.         ld l,a
  1880.         add hl,hl
  1881.         add hl,hl
  1882.         add hl,hl
  1883.         add hl,hl
  1884.         ;ld hl,320
  1885. ;de=buf
  1886. ;hl=size
  1887.         push hl
  1888.         push de
  1889.         call readstream_file
  1890.         pop de
  1891.         pop hl
  1892.         add hl,de
  1893.         ex de,hl ;de=gfx end addr
  1894.         pop ix
  1895.         pop hl
  1896.         ;pop de
  1897.          pop bc
  1898.         ;pop af
  1899.         ;ld b,a
  1900.         dec de ;gfx addr
  1901.         ld a,(ix+3)
  1902.         call bgpush_ldbmp_layerline
  1903.         dec de
  1904.         dec de
  1905.         ld a,(ix+2);(ix+1)
  1906.         call bgpush_ldbmp_layerline
  1907.         dec de
  1908.         dec de
  1909.         ld a,(ix+1);(ix+2)
  1910.         call bgpush_ldbmp_layerline        
  1911.         dec de
  1912.         dec de
  1913.         ld a,(ix+0)
  1914.         call bgpush_ldbmp_layerline        
  1915.         ;pop de
  1916.         pop bc
  1917.         ret
  1918.  
  1919. bgpush_ldbmp_layerline
  1920. ;пишем каждый четвёртый байт с конца в ld-push
  1921. ;de=gfx
  1922. ;hl=начало строки ld-push
  1923. ;a=pg
  1924. ;b=pushwid/2
  1925.         ;ld b,pushwid/2
  1926.         push bc
  1927.         SETPG32KLOW;SETPGPUSHBASE
  1928.         pop bc
  1929.         push bc
  1930.         push de
  1931.         push hl
  1932.         ;inc hl
  1933.         ;inc hl ;мы на втором байте первого слова данных в ld bc
  1934. bgpush_ldbmp_bytes0
  1935.         inc hl
  1936.         inc hl
  1937.         RECODEBYTE
  1938.         ld (hl),a
  1939.         dec hl
  1940.          dec de
  1941.          dec de
  1942.          dec de
  1943.          dec de
  1944.          dec de
  1945.          dec de
  1946.         RECODEBYTE
  1947.         ld (hl),a
  1948.         inc hl
  1949.          dec de
  1950.          dec de
  1951.          dec de
  1952.          dec de
  1953.          dec de
  1954.          dec de
  1955.         inc hl
  1956.         inc hl
  1957.         djnz bgpush_ldbmp_bytes0
  1958.         pop hl
  1959.         pop de
  1960.         pop bc
  1961.         ret
  1962.  
  1963. prcoords
  1964.         call setpgsscr40008000
  1965.         ld hl,(cameraxshift)
  1966.         ld de,0x4000 + (192*40)
  1967.         call prnum
  1968.         ld hl,(objects+obj.xspeed16)
  1969.         ld de,0x4008 + (192*40)
  1970.         call prnum
  1971.         ret
  1972.  
  1973. prnum
  1974.         ld bc,10000
  1975.         call prdig
  1976.         ld bc,1000
  1977.         call prdig
  1978.         ld bc,100
  1979.         call prdig
  1980.         ld bc,10
  1981.         call prdig
  1982.         ld bc,1
  1983. prdig
  1984.         ld a,'0'-1
  1985. prdig0
  1986.         inc a
  1987.         or a
  1988.         sbc hl,bc
  1989.         jr nc,prdig0
  1990.         add hl,bc
  1991.         ;push hl
  1992.         ;call prchar
  1993.         ;pop hl
  1994.         ;ret
  1995. prchar
  1996. ;a=code
  1997. ;de=screen
  1998.         push de
  1999.         push hl
  2000.         call prcharin
  2001.         pop hl
  2002.         pop de
  2003.         inc e
  2004.         ret
  2005.        
  2006. calcscraddr
  2007. ;bc=yx
  2008. ;можно портить bc
  2009.         ex de,hl
  2010.         ld a,c ;x
  2011.         ld l,b ;y
  2012.         ld h,0
  2013.         ld b,h
  2014.         ld c,l
  2015.         add hl,hl
  2016.         add hl,hl
  2017.         add hl,bc ;*5
  2018.          add hl,hl
  2019.          add hl,hl
  2020.          add hl,hl ;*40
  2021.          add hl,hl
  2022.          add hl,hl
  2023.          add hl,hl
  2024.         add a,l
  2025.         ld l,a
  2026.         ld a,h
  2027.         adc a,0x40
  2028.         ld h,a
  2029.         ex de,hl
  2030.         ret
  2031.  
  2032. prcharxy
  2033. ;a=code
  2034. ;bc=yx
  2035.         push de
  2036.         push hl
  2037.         push bc
  2038.         push af
  2039.         call calcscraddr
  2040.         pop af
  2041.         call prcharin
  2042.         pop bc
  2043.         pop hl
  2044.         pop de
  2045.         ret
  2046.        
  2047. prcharin
  2048.         sub 32
  2049.         ld l,a
  2050.         ld h,0
  2051.          add hl,hl
  2052.          add hl,hl
  2053.          add hl,hl
  2054.          add hl,hl
  2055.          add hl,hl
  2056.         ;ld bc,font-(32*32)
  2057.         ;add hl,bc
  2058.         ld a,h
  2059.         add a,font/256
  2060.         ld h,a
  2061. prcharin_go
  2062.         ex de,hl
  2063.        
  2064.         ld bc,40
  2065.         push hl
  2066.         push hl
  2067.         dup 8
  2068.         ld a,(de) ;font
  2069.         ld (hl),a ;scr
  2070.         inc de
  2071.         add hl,bc
  2072.         edup
  2073.         pop hl
  2074.         ;set 6,h
  2075.          ld a,h
  2076.          add a,0x40
  2077.          ld h,a
  2078.         ;ld d,font/256
  2079.         dup 8
  2080.         ld a,(de) ;font
  2081.         ld (hl),a ;scr
  2082.         inc de
  2083.         add hl,bc
  2084.         edup
  2085.         pop hl
  2086.         set 5,h
  2087.         push hl
  2088.         ;ld d,font/256
  2089.         dup 8
  2090.         ld a,(de) ;font
  2091.         ld (hl),a ;scr
  2092.         inc de
  2093.         add hl,bc
  2094.         edup
  2095.         pop hl
  2096.         ;set 6,h
  2097.          ld a,h
  2098.          add a,0x40
  2099.          ld h,a
  2100.         ;ld d,font/256
  2101.         dup 8
  2102.         ld a,(de) ;font
  2103.         ld (hl),a ;scr
  2104.         inc de
  2105.         add hl,bc
  2106.         edup        
  2107.         ret
  2108.  
  2109. genpush_newpage
  2110. ;заказывает страницу, заносит в tpushpgs, a=pg
  2111.         push bc
  2112.         push de
  2113.         push hl
  2114.         push ix
  2115.         OS_NEWPAGE
  2116.         pop ix
  2117.         ld a,e
  2118.         ld (ix),a
  2119.         ld de,4
  2120.         add ix,de
  2121.         pop hl
  2122.         pop de
  2123.         pop bc
  2124.         ret
  2125.  
  2126.         align 256
  2127. font
  2128.         incbin "fontgfx"
  2129.        
  2130. res_path
  2131.         db "sprexamp",0 ;в этом относительном пути будут лежать все загружаемые данные игры
  2132. bgfilename
  2133.         db "bg6-16c.bmp",0
  2134. bgxyfilename
  2135.         db "bg8-16d.bmp",0
  2136.  
  2137. tilefilename
  2138.         db "tiles.bin",0
  2139. tilebmpfilename
  2140.         db "tiles1.bmp",0
  2141. tilemapfilename
  2142.         db "map1.map",0
  2143. enemymapfilename
  2144.         db "map1.enm",0
  2145.  
  2146.  
  2147. TILEMAP
  2148.         ds TILEMAPWID*TILEMAPHGT ;снизу вверх, справа налево
  2149.  
  2150. tpushpgs
  2151.         ds 128 ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
  2152.  
  2153.         align 256
  2154. trecodebyteleft
  2155.         dup 256
  2156. ;%00003210 => %.3...210
  2157. _3=$&8
  2158. _210=$&7
  2159.         db (_3*0x08) + (_210*0x01)
  2160.         edup
  2161.        
  2162. trecodebyteright
  2163.         dup 256
  2164. ;%00003210 => %3.210...
  2165. _3=$&8
  2166. _210=$&7
  2167.         db (_3*0x10) + (_210*0x08)
  2168.         edup
  2169.  
  2170. bgpush_bmpbuf
  2171.         ds 1024;320 ;заголовок bmp или одна строка
  2172. end        
  2173.  
  2174.         display "begin=",begin
  2175.         display "end=",end
  2176.         display "Size ",/d,end-begin," bytes"
  2177.        
  2178.         savebin "sprexamp.com",begin,end-begin
  2179.        
  2180.         LABELSLIST "../../../us/user.l"
  2181.