?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM1024
  2.         include "../../_sdk/sys_h.asm"
  3.  
  4. scrbase=0x4000
  5. sprmaxwid=32
  6. sprmaxhgt=32
  7. scrwid=160 ;double pixels
  8. scrhgt=192-16;200
  9. clswid=40 ;*8
  10. clshgt=200
  11.  
  12. STACK=0x3ff0 ;место для вылетания за экран
  13. tempsp=0x3f06 ;6 bytes for prspr
  14. INTSTACK=0x3b80;0x3f00 ;чтобы не запороть стек загрузки bmp в bgpush
  15.  
  16. MAXSPEED=8*8-4
  17. CAMERATRACKINGSPEED_X=16 ;double pixels
  18. CAMERATRACKINGSPEED_Y=16
  19. CAMERASHIFTSPEED_X=4 ;double pixels
  20. CAMERASHIFTSPEED_Y=4
  21.  
  22.         macro RECODEBYTE
  23.         ld a,(de)
  24.         ld ($+4),a
  25.         ld a,(trecodebyteright)
  26.         ld c,a
  27.         dec de
  28.         ld a,(de)
  29.         dec de
  30.         ld ($+4),a
  31.         ld a,(trecodebyteleft)
  32.         or c
  33.         endm        
  34.  
  35.         org PROGSTART
  36. begin
  37.         jp $+3 ;/prsprqwid (спрайты в файле подготовлены так, что выходят сюда)
  38.         ld sp,STACK
  39.         OS_HIDEFROMPARENT
  40.  
  41. ;        ld b,25
  42. ;waitcls0
  43. ;        push bc
  44. ;        YIELD
  45. ;        pop bc
  46. ;        djnz waitcls0 ;чтобы nv не перехватил фокус при вызове через комстроку
  47.  
  48.         ld e,0
  49.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  50.         ld e,0
  51.         OS_SETSCREEN
  52.         ld e,0 ;color byte
  53.         OS_CLS
  54.         ld e,1
  55.         OS_SETSCREEN
  56.         ld e,0 ;color byte
  57.         OS_CLS
  58.        
  59.         OS_GETMAINPAGES
  60. ;dehl=номера страниц в 0000,4000,8000,c000
  61.         ld a,e
  62.         LD (pgmain4000),A
  63.         ld a,h
  64.         LD (pgmain8000),A
  65.         call setpgsmain40008000 ;записать в curpg...
  66.  
  67.         ;OS_GETSCREENPAGES
  68. ;de=страницы 0-го экрана (d=старшая), hl=страницы 1-го экрана (h=старшая)
  69.         ;ld a,l
  70.         ;ld (setpgs_scr_low),a
  71.         ;xor e
  72.         ;ld (setpgs_scr_scrxor),a
  73.         ;ld a,h
  74.          ;ld (ttexpgs+31),a ;ld (IR128),a ;на всякой случай, для прерывания
  75.         ;xor l
  76.         ;ld (setpgs_scr_pgxor),a
  77.  
  78.         OS_NEWPAGE
  79.         ld a,e
  80.         ld (pgfake),a ;эту страницу можно будет запарывать при отрисовке спрайтов с клипированием
  81.         ld (pgfake2),a
  82.        
  83.         ld de,res_path
  84.         OS_CHDIR
  85.  
  86.         call getmousedelta ;prepare mouse
  87.  
  88.         ld hl,texfilename
  89.         call loadpage
  90.         ld (pg0),a
  91.         call loadpage
  92.         ld (pg1),a
  93.         call loadpage
  94.         ld (pgmusic),a
  95.         SETPG16K
  96.         push af
  97.         call 0x4000 ;init
  98.         pop af
  99.         ld hl,0x4005 ;play
  100.         OS_SETMUSIC
  101.         call setpgsmain40008000
  102.        
  103.         ld hl,prsprqwid
  104.         ld (0x0101),hl ;спрайты в файле подготовлены так, что выходят в 0x0100
  105.      
  106.         call swapimer
  107.  
  108. ;UV scroll
  109.         call uvscroll_prepare
  110.         ;ld de,bgxyfilename
  111.         ;call uvscroll_preparebmp
  112.          call uvscroll_preparetiles
  113. ;TODO обновить allscroll
  114. ;allscroll=yscroll*(UVSCROLL_WID/512)+xscroll
  115.         ;jr $
  116.         ;ld hl,1;+(511*2)+(1023/256)
  117.         ;ld a,1023&0xff
  118.         ;ld (allscroll),hl
  119.         ;ld (allscroll_lsb),a
  120.         ld hl,-160 ;top left
  121.         if 1==0
  122.         ld hl,+80
  123.         ld bc,(objects+obj.y16)
  124.          dup 3
  125.          srl b
  126.          rr c
  127.          edup
  128.         or a
  129.         sbc hl,bc
  130.         endif
  131.         ld (cameraym),hl
  132.         ld (cameraymideal),hl
  133.         ld (cameraymold),hl
  134.         ld de,1024-160 ;top left
  135.         add hl,de
  136.         ld (yscroll),hl
  137.        
  138.         ld hl,-160 ;top left
  139.         if 1==0
  140.         ld hl,+80
  141.         ld bc,(objects+obj.x16)
  142.          dup 3
  143.          srl b
  144.          rr c
  145.          edup
  146.         or a
  147.         sbc hl,bc
  148.         endif
  149.         ld (cameraxm),hl
  150.         ld (cameraxmideal),hl
  151.         ld (cameraxmold),hl
  152.         ld de,2048-160 ;top left
  153.         add hl,de
  154.         ld (x2scroll),hl
  155.  
  156.          call uvscroll_preparetilemap
  157.         ld de,pal
  158.         OS_SETPAL
  159. mainloop_uv0
  160.         ;halt
  161.         call uvscroll_draw
  162.  
  163.         call drawsprites
  164.  
  165.         call prcoords
  166.  
  167.         call getmousedelta ;de=delta (d>0: go up) (e>0: go left), l=mousekey
  168.        
  169.         push hl
  170.  
  171. ;двигаем смещение камеры к идеалу (xspeed16;yspeed16), но не быстрее, чем на +-CAMERASHIFTSPEED
  172. ;и находим camerax/ymideal
  173. cameraxshift=$+1
  174.         ld hl,0
  175.         ld de,(objects+obj.xspeed16)
  176.         xor a
  177.         sbc hl,de
  178.         or h
  179.         jp m,xshifttoideal_neg
  180. ;hl=xshift-xshiftideal >=0
  181.         ld bc,CAMERASHIFTSPEED_X
  182.         sbc hl,bc
  183.         jr c,xshifttoideal_get ;не быстрее, чем на +CAMERASHIFTSPEED_X
  184.         jr xshifttoideal_limit
  185. xshifttoideal_neg
  186. ;hl=xshift-xshiftideal <0
  187.         ld bc,-CAMERASHIFTSPEED_X
  188.         sbc hl,bc
  189.         jr nc,xshifttoideal_get ;не быстрее, чем на -CAMERASHIFTSPEED_X
  190. xshifttoideal_limit
  191.         ld hl,(cameraxshift)
  192.         or a
  193.         sbc hl,bc
  194.         ex de,hl
  195. xshifttoideal_get
  196.         ex de,hl
  197. xshifttoideal_negq        
  198.         ld (cameraxshift),hl
  199.         ex de,hl
  200.  
  201.         ld hl,+80+24
  202.         ld bc,(objects+obj.x16)
  203.          dup 3
  204.          srl b
  205.          rr c
  206.          edup
  207.         or a
  208.         sbc hl,bc
  209.         ;ld de,(objects+obj.xspeed16)
  210.         or a
  211.         sbc hl,de
  212.         ld (cameraxmideal),hl
  213.  
  214. camerayshift=$+1
  215.         ld hl,0
  216.         ld de,(objects+obj.yspeed16)
  217.         xor a
  218.         sbc hl,de
  219.         or h
  220.         jp m,yshifttoideal_neg
  221. ;hl=yshift-yshiftideal >=0
  222.         ld bc,CAMERASHIFTSPEED_Y
  223.         sbc hl,bc
  224.         jr c,yshifttoideal_get ;не быстрее, чем на +CAMERASHIFTSPEED_Y
  225.         jr yshifttoideal_limit
  226. yshifttoideal_neg
  227. ;hl=yshift-yshiftideal <0
  228.         ld bc,-CAMERASHIFTSPEED_Y
  229.         sbc hl,bc
  230.         jr nc,yshifttoideal_get ;не быстрее, чем на -CAMERASHIFTSPEED_Y
  231. yshifttoideal_limit
  232.         ld hl,(camerayshift)
  233.         or a
  234.         sbc hl,bc
  235.         ex de,hl
  236. yshifttoideal_get
  237.         ex de,hl
  238. yshifttoideal_negq        
  239.         ld (camerayshift),hl
  240.         ex de,hl
  241.  
  242.         ld hl,+80+48
  243.         ld bc,(objects+obj.y16)
  244.          dup 3
  245.          srl b
  246.          rr c
  247.          edup
  248.         or a
  249.         sbc hl,bc
  250.         ;ld de,(objects+obj.yspeed16)
  251.         or a
  252.         sbc hl,de
  253.         ld (cameraymideal),hl
  254.        
  255. ;двигаем камеру к идеалу, но не быстрее, чем на +-CAMERATRACKINGSPEED
  256.         ld hl,(cameraxm)
  257. cameraxmideal=$+1
  258.         ld de,0;(cameraxmideal)
  259.         xor a
  260.         sbc hl,de
  261.         or h
  262.         jp m,xmtoideal_neg
  263. ;hl=xm-xmideal >=0
  264.         ld bc,CAMERATRACKINGSPEED_X
  265.         sbc hl,bc
  266.         jr c,xmtoideal_get ;не быстрее, чем на +CAMERATRACKINGSPEED_X
  267.         jr xmtoideal_limit
  268. xmtoideal_neg
  269. ;hl=xm-xmideal <0
  270.         ld bc,-CAMERATRACKINGSPEED_X
  271.         sbc hl,bc
  272.         jr nc,xmtoideal_get ;не быстрее, чем на -CAMERATRACKINGSPEED_X
  273. xmtoideal_limit
  274.         ld hl,(cameraxm)
  275.         or a
  276.         sbc hl,bc
  277.         ex de,hl
  278. xmtoideal_get
  279.         ex de,hl
  280. xmtoideal_negq        
  281.         ld (cameraxm),hl
  282. cameraxmold=$+1
  283.         ld de,0
  284.         ld (cameraxmold),hl
  285.         or a
  286.         sbc hl,de ;camera dx
  287.        push hl
  288.  
  289.         ld hl,(cameraym)
  290. cameraymideal=$+1
  291.         ld de,0;(cameraymideal)
  292.         xor a
  293.         sbc hl,de
  294.         or h
  295.         jp m,ymtoideal_neg
  296. ;hl=ym-ymideal >=0
  297.         ld bc,CAMERATRACKINGSPEED_Y
  298.         sbc hl,bc
  299.         jr c,ymtoideal_get ;не быстрее, чем на +CAMERATRACKINGSPEED_Y
  300.         jr ymtoideal_limit
  301. ymtoideal_neg
  302. ;hl=ym-ymideal <0
  303.         ld bc,-CAMERATRACKINGSPEED_Y
  304.         sbc hl,bc
  305.         jr nc,ymtoideal_get ;не быстрее, чем на -CAMERATRACKINGSPEED_Y
  306. ymtoideal_limit
  307.         ld hl,(cameraym)
  308.         or a
  309.         sbc hl,bc
  310.         ex de,hl
  311. ymtoideal_get
  312.         ex de,hl
  313. ymtoideal_negq        
  314.         ld (cameraym),hl
  315. cameraymold=$+1
  316.         ld de,0
  317.         ld (cameraymold),hl
  318.         or a
  319.         sbc hl,de ;camera dy
  320.        
  321.        pop bc ;camera dx
  322.          ld d,l
  323.          ld e,c
  324.         pop hl ;l=mousekey
  325.        
  326.         ld a,l ;hl=(sysmousebuttons)
  327.         rra
  328.          jr nc,mainloop_uvq ;LMB
  329.         call uvscroll_scroll
  330.         call uvscroll_scrolltiles
  331.        
  332.        ld a,(timer)
  333.        push af
  334.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  335.  
  336. mainloop_uvwaittimer0
  337.         ld a,(timer)
  338. uvoldtimer=$+1
  339.         ld b,0
  340.         ld (uvoldtimer),a
  341.         sub b
  342.         ld b,a
  343.         jr z,mainloop_uvwaittimer0
  344. mainloop_uvlogic0
  345.         push bc
  346.         call logic
  347.         pop bc
  348.         djnz mainloop_uvlogic0
  349.  
  350. ;можем начать новую отрисовку, только если с момента changescrpg прошло хотя бы одно прерывание (возможно, внутри logic)
  351.        pop bc ;b=timer на момент changescrpg
  352. waitchangescr0
  353.         ld a,(timer)
  354.         cp b
  355.         jr z,waitchangescr0
  356.  
  357.         jp mainloop_uv0
  358. mainloop_uvq
  359. ;vertical scroll
  360.         ld de,bgfilename
  361.         call bgpush_prepare
  362.  
  363.         call cls
  364.         ld de,pal;SUMMERPAL
  365.         OS_SETPAL
  366.  
  367. pg0=$+1
  368.         ld a,0
  369.         call setpgc000;SETPG32KHIGH
  370.         ld hl,0x4000 ;scr
  371.         ld de,0xc000 ;gfx
  372.         ld bc,0xc020 ;hgt,wid
  373.         call primgega
  374.  
  375. mainloop
  376.         ld bc,-1
  377.         call bgpush_inccurscroll
  378.  
  379.         call bgpush_draw ;359975t
  380.  
  381.         call drawsprites
  382.        
  383.        ld a,(timer)
  384.        push af
  385.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  386.        
  387. mainloopwaittimer0
  388.         ld a,(timer)
  389. oldtimer=$+1
  390.         ld b,0
  391.         ld (oldtimer),a
  392.         sub b
  393.         ld b,a
  394.         jr z,mainloopwaittimer0
  395. mainlooplogic0
  396.         push bc
  397.         call logic
  398.         pop bc
  399.         djnz mainlooplogic0
  400.        
  401. ;можем начать новую отрисовку, только если с момента changescrpg прошло хотя бы одно прерывание (возможно, внутри logic)
  402.        pop bc ;b=timer на момент changescrpg
  403. waitchangescr1
  404.         ld a,(timer)
  405.         cp b
  406.         jr z,waitchangescr1
  407.        
  408. ;waitkey
  409.         ;halt ;в играх не юзаем YIELD, иначе может сработать чужой обработчик прерываний
  410. curkey=$+1
  411.         ld a,0
  412.         cp key_esc
  413.         jp nz,mainloop;waitkey
  414.        
  415.         call swapimer
  416. pgmusic=$+1
  417.         ld a,0
  418.         SETPG16K
  419.         ld hl,0x4008 ;stop
  420.         OS_SETMUSIC
  421.         halt
  422.         QUIT
  423.  
  424. logic
  425.         ld ix,objects
  426. logic0
  427.         ld l,(ix+obj.animaddr16+0)
  428.         ld h,(ix+obj.animaddr16+1)
  429.         ld e,(hl)
  430.         inc hl
  431.         ld d,(hl) ;de = phase
  432.         inc hl
  433.         dec (ix+obj.animtime)
  434.         jr nz,logic_nonextphase
  435.         ld a,(hl) ;new animtime
  436.         inc hl
  437.         ld (ix+obj.animtime),a
  438.         ld e,(hl)
  439.         inc hl
  440.         ld d,(hl) ;de = phase
  441.         ld a,d
  442.         cp 0xc0
  443.         jr nc,logic_nocycleanim
  444.         ex de,hl
  445.         ;ld e,(hl)
  446.         inc hl
  447.         ;ld d,(hl) ;de = phase (>=0xc000) or new animaddr (<0xc000)
  448. logic_nocycleanim
  449.         dec hl
  450.         ld (ix+obj.animaddr16+0),l
  451.         ld (ix+obj.animaddr16+1),h
  452. logic_nonextphase
  453.  
  454.         ld a,(pgmetatilemap)
  455.         SETPG32KHIGH
  456.  
  457.         ld l,(ix+obj.xspeed16+0)
  458.         ld h,(ix+obj.xspeed16+1)
  459.         ld e,(ix+obj.x16+0)
  460.         ld d,(ix+obj.x16+1)
  461.         add hl,de
  462.         ld (ix+obj.x16+0),l
  463.         ld (ix+obj.x16+1),h
  464.         ld l,(ix+obj.yspeed16+0)
  465.         ld h,(ix+obj.yspeed16+1)
  466.         inc hl
  467.         inc hl
  468.         inc hl
  469.         inc hl ;gravity
  470.          ld a,h
  471.          rla
  472.          jr c,gravityok
  473.          ld de,8*8
  474.          or a
  475.          sbc hl,de
  476.          add hl,de
  477.          jr c,gravityok
  478.          ex de,hl
  479. gravityok
  480.         ld (ix+obj.yspeed16+0),l
  481.         ld (ix+obj.yspeed16+1),h
  482.        
  483. ;check floor
  484.         push hl
  485.         ld l,(ix+obj.y16+0) ;*8
  486.         ld h,(ix+obj.y16+1)
  487.         ld c,(ix+obj.x16+0) ;*8 (in double pixels)
  488.         ld b,(ix+obj.x16+1)
  489.          ld de,32*8
  490.          add hl,de ;координата прямо под ногами
  491.         call gettile_bycoords
  492.         pop hl
  493.         ld c,(ix+obj.y16+0)
  494.         ld b,(ix+obj.y16+1)
  495.         add hl,bc
  496.         cp 32
  497.          res 0,(ix+obj.flags) ;not on floor
  498.         jr c,nofloor
  499.          set 0,(ix+obj.flags) ;not on floor
  500. ;выравнивание по y на 16(пикс)*8
  501.         ld a,l
  502.         and 128
  503.         ld l,a
  504.         ;dec hl
  505.         push hl  
  506.         ld hl,0
  507.         ld (ix+obj.yspeed16+0),l
  508.         ld (ix+obj.yspeed16+1),h
  509.         pop hl
  510. nofloor
  511.         ld (ix+obj.y16+0),l
  512.         ld (ix+obj.y16+1),h
  513.  
  514.         ld bc,OBJSIZE
  515.         add ix,bc
  516.         bit 7,(ix+obj.y16+1) ;yhigh
  517.         jp z,logic0
  518.  
  519. ;hero control
  520. joystate=$+1
  521. oldjoystate=$+2
  522.         ld bc,0
  523.         ld a,c
  524.         ld (oldjoystate),a
  525.         xor b
  526.         ld b,a
  527. ;bit - button (ZX key)
  528. ;7 - A (A)
  529. ;6 - B (S)
  530. ;5 - Select (Space)
  531. ;4 - Start (Enter)
  532. ;3 - Up (7)
  533. ;2 - Down (6)
  534. ;1 - Left (5)
  535. ;0 - Right (8)
  536.         ld ix,objects
  537.         ld l,(ix+obj.xspeed16+0)
  538.         ld h,(ix+obj.xspeed16+1)
  539.         bit 1,c
  540.         jr z,noleft
  541.         ld a,h
  542.         or a
  543.         jp m,nostartrunleft
  544.          ld de,heroanim_runleft
  545.         ld (ix+obj.animaddr16+0),e
  546.         ld (ix+obj.animaddr16+1),d
  547. nostartrunleft
  548.         ld de,-1
  549.         add hl,de
  550.         ld de,-MAXSPEED
  551.         or a
  552.         sbc hl,de
  553.         ld a,h
  554.         add hl,de
  555.         or a
  556.         jr z,leftq
  557.         ex de,hl
  558.         jr leftq
  559. noleft
  560.         bit 0,c
  561.         jr z,noright
  562.         ld a,h
  563.         or a
  564.         jp m,startrunright
  565.         or l
  566.         jr nz,nostartrunright
  567. startrunright
  568.          ld de,heroanim_runright
  569.         ld (ix+obj.animaddr16+0),e
  570.         ld (ix+obj.animaddr16+1),d
  571. nostartrunright
  572.         ld de,1
  573.         add hl,de
  574.         ld de,MAXSPEED
  575.         or a
  576.         sbc hl,de
  577.         ld a,h
  578.         add hl,de
  579.         or a
  580.         jr nz,leftq
  581.         ex de,hl
  582.         jr leftq
  583. noright
  584.          bit 0,(ix+obj.flags) ;on floor?
  585.          jr z,leftq ;не тормозим на лету
  586.         ld a,h
  587.         or l
  588.         ld e,a
  589.          bit 7,h
  590.          jr z,$+3
  591.          inc hl
  592.          sra h
  593.          rr l
  594.          ld a,h
  595.          or l
  596.          jr nz,leftq
  597.          ld a,e
  598.          or a
  599.          jr z,leftq ;уже стояли
  600.          ld de,heroanim_stand
  601.         ld (ix+obj.animaddr16+0),e
  602.         ld (ix+obj.animaddr16+1),d
  603. leftq
  604.         ld (ix+obj.xspeed16+0),l
  605.         ld (ix+obj.xspeed16+1),h
  606. ;проверить, что не въехали в стену в текущем направлении и отскочить
  607.        push bc
  608.         bit 7,h
  609.         jr nz,checkleftwall
  610.         ld l,(ix+obj.y16+0) ;*8
  611.         ld h,(ix+obj.y16+1)
  612.         ld c,(ix+obj.x16+0) ;*8 (in double pixels)
  613.         ld b,(ix+obj.x16+1)
  614.          ld de,16*8
  615.          add hl,de ;координата на уровне пояса
  616.         call gettile_bycoords
  617.         dec l
  618.         ld a,(hl) ;правее центра
  619.         cp 64 ;beton
  620.         jr c,checkleftwallq ;not beton
  621. ;врезались справа, выравниваем x = (x&0xf0) - 1
  622.         ld l,(ix+obj.x16+0) ;*8 (in double pixels)
  623.         ld h,(ix+obj.x16+1)
  624.         ld a,l
  625.         and -8*8
  626.         ld l,a
  627.         dec hl
  628.         ld (ix+obj.x16+0),l ;*8 (in double pixels)
  629.         ld (ix+obj.x16+1),h        
  630.         jr checkleftwallq
  631. checkleftwall
  632.         ld l,(ix+obj.y16+0) ;*8
  633.         ld h,(ix+obj.y16+1)
  634.         ld c,(ix+obj.x16+0) ;*8 (in double pixels)
  635.         ld b,(ix+obj.x16+1)
  636.          ld de,16*8
  637.          add hl,de ;координата на уровне пояса
  638.         call gettile_bycoords
  639.         inc l
  640.         ld a,(hl) ;левее центра
  641.         cp 64 ;beton
  642.         jr c,checkleftwallq ;not beton
  643. ;врезались слева, выравниваем x = (x+15)&0xf0
  644.         ld l,(ix+obj.x16+0) ;*8 (in double pixels)
  645.         ld h,(ix+obj.x16+1)
  646.         ld bc,8*8-1
  647.         add hl,bc
  648.         ld a,l
  649.         and -8*8
  650.         ld l,a
  651.         ld (ix+obj.x16+0),l ;*8 (in double pixels)
  652.         ld (ix+obj.x16+1),h
  653.  
  654. checkleftwallq
  655.        pop bc
  656.  
  657.         ld l,(ix+obj.yspeed16+0)
  658.         ld h,(ix+obj.yspeed16+1)
  659.         bit 7,c
  660.         jr z,nojump
  661.         bit 7,b
  662.         jr z,nojump ;не изменилась кнопка
  663.        
  664. ;check floor
  665.         bit 0,(ix+obj.flags) ;on floor
  666.         jr z,nojump
  667.  
  668.         ld hl,-60
  669.         ld (ix+obj.yspeed16+0),l
  670.         ld (ix+obj.yspeed16+1),h
  671.         ld e,(ix+obj.y16+0)
  672.         ld d,(ix+obj.y16+1)
  673.         add hl,de
  674.         ld (ix+obj.y16+0),l
  675.         ld (ix+obj.y16+1),h
  676.        
  677.        
  678. nojump
  679.  
  680.         ret
  681.  
  682. gettile_bycoords
  683.         dup 3
  684.         srl h
  685.         rr l
  686.         edup
  687.         dup 4
  688.         add hl,hl
  689.         edup
  690.         dup 3
  691.         srl b
  692.         rr c
  693.         edup
  694.         dup 3
  695.         srl b
  696.         rr c
  697.         edup
  698.         ld a,c
  699.          sub 3
  700.         cpl
  701.         ld l,a
  702.         ld a,h
  703.          sub 3 ;проверять будем тайл в ногах, а не в голове
  704.         cpl
  705.         ld h,a
  706.         ld a,(hl) ;tile в ногах
  707.         ret
  708.  
  709. drawsprites
  710. pg1=$+1
  711.         ld a,0
  712.         call setpgc000
  713.        
  714.         ld ix,objects
  715. drawsprites0      
  716.  
  717.         ld l,(ix+obj.animaddr16+0)
  718.         ld h,(ix+obj.animaddr16+1)
  719.         ld e,(hl)
  720.         inc hl
  721.         ld d,(hl) ;de = phase
  722.  
  723.         ;ld l,(ix+obj.spraddr16+0)
  724.         ;ld h,(ix+obj.spraddr16+1)
  725.        
  726.         ex de,hl
  727.        
  728.          ;ld a,2
  729.          ;add a,0
  730.          ;ld ($-1),a
  731.          ;and 2*3
  732.          ;add a,l
  733.          ;ld l,a
  734.         ld (drawsprites0_sprdescr),hl
  735.         call setpgsscr40008000 ;предыдущий спрайт мог выключить, если был левее экрана и вообще не попал на экран? ;TODO если спрайт в границах экрана
  736. drawsprites0_sprdescr=$+2
  737.         ld iy,(0xc000);testspr
  738.  
  739. ;храним x*8 (in double pixels),y*8
  740.         ld a,(ix+obj.x16+0)
  741.         ld d,(ix+obj.x16+1)
  742.         srl d
  743.         rra
  744.         srl d
  745.         rra
  746.         srl d
  747.         rra
  748.         ld e,a
  749.        
  750. cameraxm=$+1
  751.         ld hl,0;+160;-2048+160
  752.         add hl,de
  753.          ;jr $
  754.         ld a,h
  755.         or a
  756.         jr nz,drawspr_skip
  757.         ld a,l
  758.         cp 159+sprmaxwid
  759.         jr nc,drawspr_skip
  760.         ;sub sprmaxwid-1
  761.         ld e,a
  762.        
  763.         ld a,(ix+obj.y16+0)
  764.         ld b,(ix+obj.y16+1)
  765.         srl b
  766.         rra
  767.         srl b
  768.         rra
  769.         srl b
  770.         rra
  771.         ld c,a
  772. cameraym=$+1
  773.         ld hl,0;+160;-1024+160
  774.         add hl,bc
  775.         ld a,h
  776.         or a
  777.         jr nz,drawspr_skip
  778.         ld a,l
  779.         cp 199+sprmaxhgt
  780.         jr nc,drawspr_skip
  781.         sub sprmaxhgt-1
  782.         ld c,a
  783.  
  784. ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  785. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  786.  
  787.         push ix
  788.         ;call prsprega ;(с включением экранных страниц и проверкой попадания спрайта в экран) один спрайт 16x16 = 6875t
  789.         call prspr ;(без включения экранных страниц и без проверки попадания спрайта в экран) один спрайт 16x16 = 6408t (из них 4224t само мясо)
  790.         pop ix
  791. drawspr_skip
  792.  
  793.         ld bc,OBJSIZE
  794.         add ix,bc
  795.         bit 7,(ix+obj.y16+1) ;yhigh
  796.         jr z,drawsprites0
  797. ;817000(prsprega)/793000(prspr)t на всё
  798.  
  799.         ;ld iy,(0xc000);testspr
  800.         ;ld e,110+(sprmaxwid-1) ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  801.         ;ld c,120 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  802.         ;call prsprega
  803.  
  804.         jp setpgsmain40008000
  805.  
  806.  
  807. getmousedelta
  808.         GET_KEY ;OS_GETKEYNOLANG
  809.         ld a,c ;keynolang
  810.         ;ld (key),a
  811.          jr nz,control_nofocus
  812. control_imer_oldmousecoords=$+1
  813.         ld bc,0
  814.         ld (control_imer_oldmousecoords),de
  815.         ld a,d;b
  816.         sub b;d
  817.         ld d,a
  818.         ld a,c;e
  819.         sub e;c
  820.         ld e,a
  821. control_nofocus
  822.         ;ld (control_imer_mousecoordsdelta),de
  823.         ret
  824.  
  825. loadpage
  826. ;заказывает страничку и грузит туда файл (имя файла в hl)
  827. ;out: hl=после имени файла, a=pg
  828.         push hl
  829.         OS_NEWPAGE
  830.         pop hl
  831.         ld a,e
  832.         push af ;pg
  833.         call setpgc000;SETPG32KHIGH
  834.         push hl
  835.         ex de,hl
  836.         OS_OPENHANDLE
  837.         push bc
  838.         ld de,0xc000 ;addr
  839.         ld hl,0x4000 ;size
  840.         OS_READHANDLE
  841.         pop bc
  842.         OS_CLOSEHANDLE                
  843.         pop hl
  844.         ld b,1
  845.         xor a
  846.         cpir ;after 0
  847.         pop af ;pg
  848.         ret
  849.  
  850.         include "pal.ast"
  851. ;SUMMERPAL
  852. ;DDp palette: %grbG11RB(low),%grbG11RB(high), инверсные
  853.         ;dw 0xffff,0xfefe,0x1d1d,0x3c3c,0xcdcd,0x4c4c,0x2c2c,0xecec
  854.         ;dw 0xfdfd,0x2d2d,0xeeee,0x3f3f,0xafaf,0x5d5d,0x4e4e,0x0c0c
  855. ;RSTPAL
  856. ;        STANDARDPAL
  857.  
  858.  
  859. texfilename
  860.         db "WBAR.bin",0
  861.         db "WHUM1.bin",0
  862.         db "music.bin",0
  863.  
  864. primgega
  865. ;b=hgt,c=wid (/2)
  866. ;de=gfx
  867. ;hl=scr
  868.         push bc
  869.         call setpgsscr40008000
  870.         pop bc
  871. primgega0
  872.         push bc
  873.         ld hx,b
  874.         push hl
  875.         ld bc,40
  876. primgegacolumn0
  877.         ld a,(de)
  878.         inc de
  879.         ld (hl),a
  880.         add hl,bc
  881.         dec hx
  882.         jr nz,primgegacolumn0
  883.         pop hl
  884.         ld a,0x9f;0xa0
  885.         cp h
  886.         ld bc,0x4000
  887.         adc hl,bc
  888.         jp pe,primgegacolumn0q ;в половине случаев
  889. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  890.          inc a
  891.         xor h
  892.         ld h,a
  893. primgegacolumn0q
  894.         pop bc
  895.         dec c
  896.         jr nz,primgega0
  897.         jp setpgsmain40008000
  898.        
  899. prsprega
  900. ;iy=spr (+4)
  901. ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  902. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  903.         push bc
  904.         call setpgsscr40008000
  905.         pop bc      
  906.         ld a,e
  907.         cp scrwid+(sprmaxwid-1)
  908.         jr nc,noprspr
  909.         ld a,c
  910.         add a,sprmaxhgt-1
  911.         cp scrhgt+(sprmaxhgt-1)
  912.         call c,prspr
  913. noprspr
  914.         ;jp setpgsmain40008000
  915.  
  916. setpgsmain40008000
  917. pgmain4000=$+1
  918.         ld a,0
  919.         ;ld (curpg4000),a
  920.         SETPG16K
  921. pgmain8000=$+1
  922.         ld a,0
  923.         ;ld (curpg8000),a
  924.         SETPG32KLOW
  925.         ret
  926.  
  927. setpgsscr40008000_current
  928.         call getuser_scr_low_cur
  929.         ;ld (curpg4000),a ;TODO kill
  930.         SETPG16K
  931.         call getuser_scr_high_cur
  932.         ;ld (curpg8000),a ;TODO kill
  933.         SETPG32KLOW
  934.         ret
  935.  
  936. setpgsscr40008000
  937.         call getuser_scr_low
  938.         ;ld (curpg4000),a ;TODO kill
  939.         SETPG16K
  940.         call getuser_scr_high
  941.         ;ld (curpg8000),a ;TODO kill
  942.         SETPG32KLOW
  943.         ret
  944.  
  945. setpgscrlow4000
  946.         call getuser_scr_low
  947.         SETPG16K
  948.         ret
  949.  
  950. setpgscrhigh4000
  951.         call getuser_scr_high
  952.         SETPG16K
  953.         ret
  954.  
  955. getuser_scr_low
  956. getuser_scr_low_patch=$+1
  957. getuser_scr_low_patchN=0xff&(user_scr0_low^user_scr1_low)
  958.         ld a,(user_scr1_low) ;ok
  959.         ret
  960.  
  961. getuser_scr_high
  962. getuser_scr_high_patch=$+1
  963. getuser_scr_high_patchN=0xff&(user_scr0_high^user_scr1_high)
  964.         ld a,(user_scr1_high) ;ok
  965.         ret
  966.  
  967. getuser_scr_low_cur
  968. getuser_scr_low_cur_patch=$+1
  969. getuser_scr_low_cur_patchN=0xff&(user_scr0_low^user_scr1_low)
  970.         ld a,(user_scr0_low) ;ok
  971.         ret
  972.  
  973. getuser_scr_high_cur
  974. getuser_scr_high_cur_patch=$+1
  975. getuser_scr_high_cur_patchN=0xff&(user_scr0_high^user_scr1_high)
  976.         ld a,(user_scr0_high) ;ok
  977.         ret
  978.  
  979. changescrpg_current
  980. ;        ld a,(setpgs_scr_low)
  981. ;setpgs_scr_scrxor=$+1
  982. ;        xor 0
  983. ;        ld (setpgs_scr_low),a
  984.         ld hl,getuser_scr_low_patch
  985.         ld a,(hl)
  986.         xor getuser_scr_low_patchN
  987.         ld (hl),a
  988.         ld hl,getuser_scr_high_patch
  989.         ld a,(hl)
  990.         xor getuser_scr_high_patchN
  991.         ld (hl),a
  992.         ld hl,getuser_scr_low_cur_patch
  993.         ld a,(hl)
  994.         xor getuser_scr_low_cur_patchN
  995.         ld (hl),a
  996.         ld hl,getuser_scr_high_cur_patch
  997.         ld a,(hl)
  998.         xor getuser_scr_high_cur_patchN
  999.         ld (hl),a
  1000.  
  1001.         ld a,1
  1002. curscrnum=$+1
  1003.         xor 0
  1004.         ld ($-1),a
  1005.         ret
  1006.        
  1007. changescrpg
  1008.         ;jr $
  1009.         call changescrpg_current
  1010.         ld (curscrnum_int),a
  1011.         ;ld e,a
  1012.         ;OS_SETSCREEN
  1013.         ret
  1014.        
  1015. setpgc000
  1016.         ;ld (curpgc000),a
  1017.         SETPG32KHIGH
  1018.         ret
  1019.  
  1020. testspr=$+4
  1021. _hgt=16
  1022. _wid=8 ;width/2
  1023.         db _wid
  1024.         db _hgt
  1025. _=_wid
  1026.         dup _wid
  1027.         dup _hgt*2
  1028.         db (0xaa+$)&0xff
  1029.         edup
  1030. _=_-1
  1031.         if _ != 0
  1032.         dw 0x4000 - ((_hgt-1)*40)
  1033.         else
  1034.         dw 0xffff
  1035.         endif
  1036.         edup
  1037.         dw prsprqwid
  1038.  
  1039.  
  1040.  
  1041. HERO0=0xc000+(24*2)
  1042. HERO1=0xc000+(25*2)
  1043. HERORUNRIGHT0=0xc000+(26*2)
  1044. HERORUNRIGHT1=0xc000+(27*2)
  1045. HERORUNRIGHT2=0xc000+(28*2)
  1046. HERORUNLEFT0=0xc000+(29*2)
  1047. HERORUNLEFT1=0xc000+(30*2)
  1048. HERORUNLEFT2=0xc000+(31*2)
  1049.  
  1050. heroanim_stand
  1051.         dw HERO0
  1052.         db 25
  1053.         dw HERO1
  1054.         db 25
  1055.         dw heroanim_stand
  1056. heroanim_runright
  1057.         dw HERORUNRIGHT0
  1058.         db 4
  1059.         dw HERORUNRIGHT1
  1060.         db 4
  1061.         dw HERORUNRIGHT2
  1062.         db 4
  1063.         dw heroanim_runright
  1064. heroanim_runleft
  1065.         dw HERORUNLEFT0
  1066.         db 4
  1067.         dw HERORUNLEFT1
  1068.         db 4
  1069.         dw HERORUNLEFT2
  1070.         db 4
  1071.         dw heroanim_runleft
  1072.  
  1073.         STRUCT obj
  1074. y16     WORD
  1075. x16     WORD
  1076. ;sprite16 WORD
  1077. animtime BYTE
  1078. animaddr16 WORD
  1079. xspeed16 WORD
  1080. yspeed16 WORD
  1081. health  BYTE
  1082. flags   BYTE ;b0=on ground, b1=jump not released, b2=blinking, b4=провалиться
  1083. sz
  1084.         ENDS
  1085.  
  1086. OBJSIZE=obj.sz
  1087. objects
  1088. ;y16 (*8)
  1089. ;x16 (*8) (in double pixels)
  1090. ;animtime
  1091. ;animaddr16
  1092. ;xspeed16
  1093. ;yspeed16
  1094. ;health
  1095. _=0
  1096. _x=10
  1097.         dup 1
  1098. _y=100
  1099.         dup 1;  3
  1100.        
  1101.         dw 8*_y ;y
  1102.         dw 8*(_x+(sprmaxwid-1)) ;x
  1103.         ;dw HERO0
  1104.         db 1
  1105.         dw heroanim_stand
  1106.         dw 1
  1107.         dw 0
  1108.         db 100
  1109.         db 0 ;flags
  1110. _=_+1
  1111. _y=_y+40
  1112.         edup
  1113. _x=_x+20
  1114.         edup
  1115.         dw -1
  1116.  
  1117.         include "int.asm"
  1118.         include "cls.asm"
  1119.         include "prspr.asm"
  1120.         include "bgpush.asm"
  1121.         include "bgpushxy.asm"
  1122.         include "../../_sdk/file.asm"
  1123.  
  1124. readbmphead_pal
  1125.         ld de,bgpush_bmpbuf
  1126.         ld hl,14+2;54+(4*16)
  1127. ;de=buf
  1128. ;hl=size
  1129.         call readstream_file
  1130.         ld de,bgpush_bmpbuf
  1131.         ld hl,(bgpush_bmpbuf+14)
  1132.         dec hl
  1133.         dec hl
  1134. ;de=buf
  1135. ;hl=size
  1136.         call readstream_file
  1137.         ld de,bgpush_bmpbuf
  1138.         ld hl,+(4*16)
  1139. ;de=buf
  1140. ;hl=size
  1141.         call readstream_file
  1142.  
  1143.         ld hl,bgpush_bmpbuf;+54
  1144.         ld ix,pal
  1145.         ld b,16
  1146. recodepal0
  1147.         ld e,(hl)
  1148.         inc hl
  1149.         ld d,(hl)
  1150.         inc hl
  1151.         push hl
  1152.         ld l,(hl) ;e=B, d=G, l=R
  1153.         call readfile_rgbtopal
  1154.         pop hl
  1155.         inc hl
  1156.         inc hl
  1157.         djnz recodepal0
  1158.         ret
  1159.  
  1160. readfile_rgbtopal
  1161. ;e=B, d=G, l=R
  1162.         call calcRGBtopal_pp
  1163.         ld (ix+1),a
  1164.         call calcRGBtopal_pp
  1165.         ld (ix),a
  1166.         inc ix
  1167.         inc ix
  1168.         ret
  1169.  
  1170. calcRGBtopal_pp
  1171. ;e=B, d=G, l=R
  1172. ;DDp palette: %grbG11RB(low),%grbG11RB(high), ??oN????N
  1173.         xor a
  1174.         rl e  ;B
  1175.         rra
  1176.         rl l  ;R
  1177.         rra
  1178.         rrca
  1179.         rrca
  1180.         rl d  ;G
  1181.         rra
  1182.         rl e  ;b
  1183.         rra
  1184.         rl l  ;r
  1185.         rra
  1186.         rl d  ;g
  1187.         rra
  1188.         cpl
  1189.         ret
  1190.  
  1191. bgpush_ldbmp_line
  1192. ;hl=начало строки ld-push
  1193. ;a=pushwid/2
  1194.         push bc
  1195.         ;push de
  1196.  
  1197.          push af
  1198.         ;push de
  1199.         push hl
  1200.         push ix
  1201.         ld de,bgpush_bmpbuf
  1202.         ld h,0
  1203.         ld l,a
  1204.         add hl,hl
  1205.         add hl,hl
  1206.         add hl,hl
  1207.         add hl,hl
  1208.         ;ld hl,320
  1209. ;de=buf
  1210. ;hl=size
  1211.         push hl
  1212.         push de
  1213.         call readstream_file
  1214.         pop de
  1215.         pop hl
  1216.         add hl,de
  1217.         ex de,hl ;de=gfx end addr
  1218.         pop ix
  1219.         pop hl
  1220.         ;pop de
  1221.          pop bc
  1222.         ;pop af
  1223.         ;ld b,a
  1224.         dec de ;gfx addr
  1225.         ld a,(ix+3)
  1226.         call bgpush_ldbmp_layerline
  1227.         dec de
  1228.         dec de
  1229.         ld a,(ix+2);(ix+1)
  1230.         call bgpush_ldbmp_layerline
  1231.         dec de
  1232.         dec de
  1233.         ld a,(ix+1);(ix+2)
  1234.         call bgpush_ldbmp_layerline        
  1235.         dec de
  1236.         dec de
  1237.         ld a,(ix+0)
  1238.         call bgpush_ldbmp_layerline        
  1239.         ;pop de
  1240.         pop bc
  1241.         ret
  1242.  
  1243. bgpush_ldbmp_layerline
  1244. ;пишем каждый четвёртый байт с конца в ld-push
  1245. ;de=gfx
  1246. ;hl=начало строки ld-push
  1247. ;a=pg
  1248. ;b=pushwid/2
  1249.         ;ld b,pushwid/2
  1250.         push bc
  1251.         SETPG32KLOW;SETPGPUSHBASE
  1252.         pop bc
  1253.         push bc
  1254.         push de
  1255.         push hl
  1256.         ;inc hl
  1257.         ;inc hl ;мы на втором байте первого слова данных в ld bc
  1258. bgpush_ldbmp_bytes0
  1259.         inc hl
  1260.         inc hl
  1261.         RECODEBYTE
  1262.         ld (hl),a
  1263.         dec hl
  1264.          dec de
  1265.          dec de
  1266.          dec de
  1267.          dec de
  1268.          dec de
  1269.          dec de
  1270.         RECODEBYTE
  1271.         ld (hl),a
  1272.         inc hl
  1273.          dec de
  1274.          dec de
  1275.          dec de
  1276.          dec de
  1277.          dec de
  1278.          dec de
  1279.         inc hl
  1280.         inc hl
  1281.         djnz bgpush_ldbmp_bytes0
  1282.         pop hl
  1283.         pop de
  1284.         pop bc
  1285.         ret
  1286.  
  1287. prcoords
  1288.         call setpgsscr40008000
  1289.         ld hl,(cameraxshift)
  1290.         ld de,0x4000 + (192*40)
  1291.         call prnum
  1292.         ld hl,(objects+obj.xspeed16)
  1293.         ld de,0x4008 + (192*40)
  1294.         call prnum
  1295.         ret
  1296.  
  1297. prnum
  1298.         ld bc,10000
  1299.         call prdig
  1300.         ld bc,1000
  1301.         call prdig
  1302.         ld bc,100
  1303.         call prdig
  1304.         ld bc,10
  1305.         call prdig
  1306.         ld bc,1
  1307. prdig
  1308.         ld a,'0'-1
  1309. prdig0
  1310.         inc a
  1311.         or a
  1312.         sbc hl,bc
  1313.         jr nc,prdig0
  1314.         add hl,bc
  1315.         ;push hl
  1316.         ;call prchar
  1317.         ;pop hl
  1318.         ;ret
  1319. prchar
  1320. ;a=code
  1321. ;de=screen
  1322.         push de
  1323.         push hl
  1324.         call prcharin
  1325.         pop hl
  1326.         pop de
  1327.         inc e
  1328.         ret
  1329.        
  1330. calcscraddr
  1331. ;bc=yx
  1332. ;можно портить bc
  1333.         ex de,hl
  1334.         ld a,c ;x
  1335.         ld l,b ;y
  1336.         ld h,0
  1337.         ld b,h
  1338.         ld c,l
  1339.         add hl,hl
  1340.         add hl,hl
  1341.         add hl,bc ;*5
  1342.          add hl,hl
  1343.          add hl,hl
  1344.          add hl,hl ;*40
  1345.          add hl,hl
  1346.          add hl,hl
  1347.          add hl,hl
  1348.         add a,l
  1349.         ld l,a
  1350.         ld a,h
  1351.         adc a,0x40
  1352.         ld h,a
  1353.         ex de,hl
  1354.         ret
  1355.  
  1356. prcharxy
  1357. ;a=code
  1358. ;bc=yx
  1359.         push de
  1360.         push hl
  1361.         push bc
  1362.         push af
  1363.         call calcscraddr
  1364.         pop af
  1365.         call prcharin
  1366.         pop bc
  1367.         pop hl
  1368.         pop de
  1369.         ret
  1370.        
  1371. prcharin
  1372.         sub 32
  1373.         ld l,a
  1374.         ld h,0
  1375.          add hl,hl
  1376.          add hl,hl
  1377.          add hl,hl
  1378.          add hl,hl
  1379.          add hl,hl
  1380.         ;ld bc,font-(32*32)
  1381.         ;add hl,bc
  1382.         ld a,h
  1383.         add a,font/256
  1384.         ld h,a
  1385. prcharin_go
  1386.         ex de,hl
  1387.        
  1388.         ld bc,40
  1389.         push hl
  1390.         push hl
  1391.         dup 8
  1392.         ld a,(de) ;font
  1393.         ld (hl),a ;scr
  1394.         inc de
  1395.         add hl,bc
  1396.         edup
  1397.         pop hl
  1398.         ;set 6,h
  1399.          ld a,h
  1400.          add a,0x40
  1401.          ld h,a
  1402.         ;ld d,font/256
  1403.         dup 8
  1404.         ld a,(de) ;font
  1405.         ld (hl),a ;scr
  1406.         inc de
  1407.         add hl,bc
  1408.         edup
  1409.         pop hl
  1410.         set 5,h
  1411.         push hl
  1412.         ;ld d,font/256
  1413.         dup 8
  1414.         ld a,(de) ;font
  1415.         ld (hl),a ;scr
  1416.         inc de
  1417.         add hl,bc
  1418.         edup
  1419.         pop hl
  1420.         ;set 6,h
  1421.          ld a,h
  1422.          add a,0x40
  1423.          ld h,a
  1424.         ;ld d,font/256
  1425.         dup 8
  1426.         ld a,(de) ;font
  1427.         ld (hl),a ;scr
  1428.         inc de
  1429.         add hl,bc
  1430.         edup        
  1431.         ret
  1432.  
  1433.         align 256
  1434. font
  1435.         incbin "fontgfx"
  1436.        
  1437. res_path
  1438.         db "sprexamp",0 ;в этом относительном пути будут лежать все загружаемые данные игры
  1439. bgfilename
  1440.         db "bg6-16c.bmp",0
  1441. bgxyfilename
  1442.         db "bg8-16d.bmp",0
  1443.  
  1444. TILEMAP
  1445.         ds TILEMAPWID*TILEMAPHGT ;снизу вверх, справа налево
  1446.  
  1447. tpushpgs
  1448.         ds 128 ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
  1449.  
  1450.         align 256
  1451. trecodebyteleft
  1452.         dup 256
  1453. ;%00003210 => %.3...210
  1454. _3=$&8
  1455. _210=$&7
  1456.         db (_3*0x08) + (_210*0x01)
  1457.         edup
  1458.        
  1459. trecodebyteright
  1460.         dup 256
  1461. ;%00003210 => %3.210...
  1462. _3=$&8
  1463. _210=$&7
  1464.         db (_3*0x10) + (_210*0x08)
  1465.         edup
  1466.  
  1467. bgpush_bmpbuf
  1468.         ds 1024;320 ;заголовок bmp или одна строка
  1469. end        
  1470.  
  1471.         display "begin=",begin
  1472.         display "end=",end
  1473.         display "Size ",/d,end-begin," bytes"
  1474.        
  1475.         savebin "sprexamp.com",begin,end-begin
  1476.        
  1477.         LABELSLIST "../../../us\user.l"
  1478.