?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM1024
  2.         include "../../_sdk/sys_h.asm"
  3.  
  4. OLDDRAWSPR=0;1
  5.  
  6. DEBUGPRINT=0
  7.  
  8. scrbase=0x4000
  9. sprmaxwid=32
  10. sprmaxhgt=32
  11. scrwid=160 ;double pixels
  12. scrhgt=192-16;200
  13. clswid=40 ;*8
  14. clshgt=200
  15.  
  16. STACK=0x3ff0 ;место для вылетания за экран
  17. tempsp=0x3f06 ;6 bytes for prspr
  18. INTSTACK=0x3f00;0x3b80 ;чтобы не запороть стек загрузки bmp в bgpush (теперь он в 0x4000+)
  19.  
  20. XSUBPIX8=8
  21. YSUBPIX8=8
  22.  
  23. MAXSPEED=4*XSUBPIX8
  24. CAMERATRACKINGSPEED_X=16 ;double pixels
  25. CAMERATRACKINGSPEED_Y=16
  26. CAMERASHIFTSPEED_X=4 ;double pixels
  27. CAMERASHIFTSPEED_Y=4
  28.  
  29. FIRSTSOLIDTILE=32
  30. FIRSTBETONTILE=64
  31. FIRSTOBJTILE=111
  32.  
  33. ;PENT=0
  34.  
  35.  
  36. uvscroll_scrbase=0x4000
  37. uvscroll_pushbase=0x8000
  38. uvscroll_callbase=0xc000
  39.  
  40.  
  41. UVSCROLL_WID=1024
  42. UVSCROLL_HGT=256;512
  43. TILEMAPWID=42 ;целые метатайлы
  44. TILEMAPHGT=24 ;целые метатайлы
  45. UVSCROLL_SCRWID=320 ;8*(TILEMAPWID-2)
  46. UVSCROLL_SCRHGT=192-16 ;(делится на 16!!!) ;8*(TILEMAPHGT-2) ;чтобы выводить всегда 12 метатайлов (3 блока по 8) по высоте
  47. UVSCROLL_NPUSHES=UVSCROLL_WID/2/4/2
  48. UVSCROLL_SCRNPUSHES=UVSCROLL_SCRWID/2/4/2
  49.  
  50. UVSCROLL_SCRSTART=uvscroll_scrbase+((UVSCROLL_SCRHGT-1)*40)
  51. UVSCROLL_LINESTEP=-40
  52.  
  53. UVSCROLL_NCALLPGS=4
  54.  
  55. UVSCROLL_TEMPSP=tempsp
  56.  
  57. METATILEMAPWID=256;64
  58. METATILEMAPHGT=64
  59. TILEGFX=0xc000
  60.  
  61. DELETEDYHIGH=0x7f
  62.  
  63. pushbase=0x8000;c000
  64.         macro SETPGPUSHBASE
  65.          ;ld (curpgc000),a
  66.          ;SETPG32KHIGH
  67.         ;ld (curpg8000),a
  68.         SETPG32KLOW
  69.         endm
  70.  
  71.         macro RECODEBYTE
  72.         ld a,(de)
  73.         ld ($+4),a
  74.         ld a,(trecodebyteright)
  75.         ld c,a
  76.         dec de
  77.         ld a,(de)
  78.         dec de
  79.         ld ($+4),a
  80.         ld a,(trecodebyteleft)
  81.         or c
  82.         endm        
  83.  
  84.         org PROGSTART
  85. begin
  86.         jp GO ;/prsprqwid (спрайты в файле подготовлены так, что выходят сюда)
  87.        
  88. mainloop_uv0
  89.  
  90.         ld a,(curscrnum)
  91.         or a
  92.         ld hl,(allscroll)
  93.         ld a,(allscroll_lsb)
  94.         jr z,mainloop_uv_getcurscroll0
  95. allscroll_scr1=$+1
  96.         ld de,-1
  97.         ld (allscroll_scr1),hl
  98. allscroll_lsb_scr1=$+1
  99.         ld c,-1
  100.         ld (allscroll_lsb_scr1),a
  101.         jr mainloop_uv_getcurscrollok
  102. mainloop_uv_getcurscroll0
  103. allscroll_scr0=$+1
  104.         ld de,-1
  105.         ld (allscroll_scr0),hl
  106. allscroll_lsb_scr0=$+1
  107.         ld c,-1
  108.         ld (allscroll_lsb_scr0),a
  109. mainloop_uv_getcurscrollok
  110.  
  111. skipfastredraws=$+1
  112.         ld b,1
  113.         dec b
  114.         jr nz,mainloop_uv_dodrawbg
  115.         cp c
  116.         jr nz,mainloop_uv_dodrawbg
  117.         or a
  118.         sbc hl,de
  119.         ;jr nz,mainloop_uv_dodrawbg
  120.         jr z,mainloop_uv_nodrawbg
  121. mainloop_uv_dodrawbg
  122.          ld a,b
  123.          ld (skipfastredraws),a
  124.         call uvscroll_draw ;367574/391621
  125.         jr mainloop_uv_drawbgq
  126. mainloop_uv_nodrawbg
  127. ;copy scr behind sprites
  128.         ;ld hl,spritesA+5;/B/C
  129.         ld a,(curspritesN)
  130.         inc a
  131.         cp 3
  132.         jr nz,$+3
  133.         xor a ;берём спрайты на 2 отрисовки раньше (т.е. буфер следующий из 3)
  134.         call getspritesN_a_tode
  135.         ex de,hl
  136.          ld l,0
  137.          ld l,(hl)        
  138.         inc l
  139.         dec l
  140.         jr z,undrawsprites0q
  141. undrawsprites0
  142.         ld a,(hl)
  143.         dec hl
  144.         SETPG32KHIGH
  145.         ld a,(hl)
  146.        ;sub 0x80
  147.         ld hy,a
  148.         dec hl
  149.         ld a,(hl)
  150.         ld ly,a
  151.         dec hl
  152.         ld c,(hl) ;y
  153.         dec hl
  154.         ld e,(hl) ;x
  155. ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  156. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  157.         push hl
  158.         ;jr $
  159.         call copyboxscrtoscr
  160.         pop hl
  161.         dec l
  162.         jp nz,undrawsprites0
  163. undrawsprites0q
  164.         call setpgsmain40008000
  165.        
  166. mainloop_uv_drawbgq
  167.  
  168.        if OLDDRAWSPR==1
  169.         ld ix,objects
  170.         call drawsprites
  171.         ld ix,bullets
  172.         call drawsprites
  173.        else
  174. curspritesN=$+1
  175.         ld a,0
  176.         call getspritesN_a_tode
  177.         ld ix,objects
  178.         call preparedrawsprites ;1720
  179.         ld ix,bullets
  180.         call preparedrawsprites ;1110
  181.         dec de
  182.         ld (drawsprites_data),de
  183.          ld a,e
  184.          ld e,0
  185.          ld (de),a
  186.         call drawsprites ;24040 (только герой)
  187.         ld a,(curspritesN)
  188.         inc a
  189.         cp 3
  190.         jr nz,$+3
  191.         xor a
  192.         ld (curspritesN),a
  193.        endif
  194.  
  195.         call usetrackcamera
  196. ;d=camera dy
  197. ;e=camera dx
  198. ;l=mousekey
  199.         ld a,l ;hl=(sysmousebuttons)
  200.         rra
  201.          ;jr nc,mainloop_uvq ;LMB
  202.         call uvscroll_scroll
  203.         call uvscroll_scrolltiles ;23099(21121 ldir)/46220
  204.        
  205.        ld a,(timer)
  206.        push af
  207.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  208. mainloop_uvwaittimer0
  209.         ld a,(timer)
  210. uvoldtimer=$+1
  211.         ld b,0
  212.         ld (uvoldtimer),a
  213.         sub b
  214.         ld b,a
  215.         jr z,mainloop_uvwaittimer0
  216. mainloop_uvlogic0
  217.         push bc
  218.         call logic
  219.         pop bc
  220.         djnz mainloop_uvlogic0
  221.  
  222. ;можем начать новую отрисовку, только если с момента changescrpg прошло хотя бы одно прерывание (возможно, внутри logic)
  223.        pop bc ;b=timer на момент changescrpg
  224. waitchangescr0
  225.         ld a,(timer)
  226.         cp b
  227.         jr z,waitchangescr0
  228.  
  229.         ld a,(curkey)
  230.         cp key_esc
  231.         jp nz,mainloop_uv0
  232. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  233. mainloop_uvq
  234.  
  235.         if 1==1
  236.  
  237. ;vertical scroll
  238.         ld de,bgfilename
  239.         call bgpush_prepare
  240.  
  241.         call cls
  242.         ld de,pal;SUMMERPAL
  243.         OS_SETPAL
  244.  
  245. mainloop
  246.         ld bc,-1
  247.         call bgpush_inccurscroll
  248.  
  249.         call bgpush_draw ;359975t
  250.  
  251.         ld de,spritesA+1
  252.         call preparedrawsprites
  253.         dec de
  254.         ld (drawsprites_data),de
  255.         call drawsprites
  256.        
  257.        ld a,(timer)
  258.        push af
  259.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  260.        
  261. mainloopwaittimer0
  262.         ld a,(timer)
  263. oldtimer=$+1
  264.         ld b,0
  265.         ld (oldtimer),a
  266.         sub b
  267.         ld b,a
  268.         jr z,mainloopwaittimer0
  269. mainlooplogic0
  270.         push bc
  271.         call logic
  272.         pop bc
  273.         djnz mainlooplogic0
  274.        
  275. ;можем начать новую отрисовку, только если с момента changescrpg прошло хотя бы одно прерывание (возможно, внутри logic)
  276.        pop bc ;b=timer на момент changescrpg
  277. waitchangescr1
  278.         ld a,(timer)
  279.         cp b
  280.         jr z,waitchangescr1
  281.        
  282. ;waitkey
  283.         ;halt ;в играх не юзаем YIELD, иначе может сработать чужой обработчик прерываний
  284.         ld a,(curkey)
  285.         cp key_esc
  286.         jp nz,mainloop;waitkey
  287.  
  288.         endif
  289.  
  290.         call swapimer
  291. pgmusic=$+1
  292.         ld a,0
  293.         SETPG16K
  294.         ld hl,0x4008+3 ;stop
  295.         OS_SETMUSIC
  296.         halt
  297.         QUIT
  298.  
  299. curkey
  300.         db 0
  301.  
  302. getspritesN_a_tode
  303.         or a
  304.         ld de,spritesA+1
  305.         ret z
  306.         dec a
  307.         ld de,spritesB+1
  308.         ret z
  309.         ld de,spritesC+1
  310.         ret
  311.  
  312.         if OLDDRAWSPR==1
  313. drawsprites
  314. pg1=$+1
  315.         ld a,0
  316.         call setpgc000
  317. drawsprites0      
  318.         bit 7,(ix+obj.y16+1) ;yhigh
  319.         jp nz,setpgsmain40008000
  320.  
  321.         ld l,(ix+obj.animaddr16+0)
  322.         ld h,(ix+obj.animaddr16+1)
  323.         ld e,(hl)
  324.         inc hl
  325.         ld d,(hl) ;de = phase
  326.  
  327.         ;ld l,(ix+obj.spraddr16+0)
  328.         ;ld h,(ix+obj.spraddr16+1)
  329.        
  330.         ex de,hl
  331.        
  332.          ;ld a,2
  333.          ;add a,0
  334.          ;ld ($-1),a
  335.          ;and 2*3
  336.          ;add a,l
  337.          ;ld l,a
  338.         ld (drawsprites0_sprdescr),hl
  339.         call setpgsscr40008000 ;предыдущий спрайт мог выключить, если был левее экрана и вообще не попал на экран? ;TODO если спрайт в границах экрана
  340. drawsprites0_sprdescr=$+2
  341.         ld iy,(0xc000);testspr
  342.  
  343. ;храним x*XSUBPIX8 (in double pixels),y*YSUBPIX8
  344.         ld a,(ix+obj.x16+0)
  345.         ld d,(ix+obj.x16+1)
  346.         srl d
  347.         rra
  348.         srl d
  349.         rra
  350.         srl d
  351.         rra
  352.         ld e,a
  353.        
  354. cameraxm=$+1
  355.         ld hl,0;+160;-2048+160
  356.         add hl,de
  357.          ;jr $
  358.         ld a,h
  359.         or a
  360.         jr nz,drawspr_skip
  361.         ld a,l
  362.         cp 159+sprmaxwid
  363.         jr nc,drawspr_skip
  364.         ;sub sprmaxwid-1
  365.         ld e,a
  366.        
  367.         ld a,(ix+obj.y16+0)
  368.         ld b,(ix+obj.y16+1)
  369.         srl b
  370.         rra
  371.         srl b
  372.         rra
  373.         srl b
  374.         rra
  375.         ld c,a
  376. cameraym=$+1
  377.         ld hl,0;+160;-1024+160
  378.         add hl,bc
  379.         ld a,h
  380.         or a
  381.         jr nz,drawspr_skip
  382.         ld a,l
  383.         cp 199+sprmaxhgt
  384.         jr nc,drawspr_skip
  385.         sub sprmaxhgt-1
  386.         ld c,a
  387.  
  388. ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  389. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  390.  
  391.         push ix
  392.         ;call prsprega ;(с включением экранных страниц и проверкой попадания спрайта в экран) один спрайт 16x16 = 6875t
  393.         call prspr ;(без включения экранных страниц и без проверки попадания спрайта в экран) один спрайт 16x16 = 6408t (из них 4224t само мясо)
  394.         pop ix
  395. drawspr_skip
  396.  
  397.         ld bc,OBJSIZE
  398.         add ix,bc
  399.         jp drawsprites0
  400. ;817000(prsprega)/793000(prspr)t на всё
  401.         endif
  402.  
  403.         if OLDDRAWSPR==0
  404. preparedrawsprites
  405. ;pg1=$+1
  406.         ld a,(pg1) ;страница описателей спрайтов
  407.         call setpgc000
  408. preparedrawsprites0
  409.         bit 7,(ix+obj.y16+1) ;yhigh
  410.         ret nz ;jp nz,preparedrawspritesq ;setpgsmain40008000
  411.  
  412. ;храним x*XSUBPIX8 (in double pixels),y*YSUBPIX8
  413.         ld a,(ix+obj.x16+0)
  414.         ld b,(ix+obj.x16+1)
  415.         srl b
  416.         rra
  417.         srl b
  418.         rra
  419.         srl b
  420.         rra
  421.         ld c,a
  422. cameraxm=$+1
  423.         ld hl,0;+160;-2048+160
  424.         add hl,bc
  425.         ld a,h
  426.         or a
  427.         jr nz,preparedrawspr_skip
  428.         ld a,l
  429.         cp 159+sprmaxwid
  430.         jr nc,preparedrawspr_skip
  431.         ;ld e,a
  432.          ld (de),a ;x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  433.        
  434.         ld a,(ix+obj.y16+0)
  435.         ld b,(ix+obj.y16+1)
  436.         srl b
  437.         rra
  438.         srl b
  439.         rra
  440.         srl b
  441.         rra
  442.         ld c,a
  443. cameraym=$+1
  444.         ld hl,0;+160;-1024+160
  445.         add hl,bc
  446.         ld a,h
  447.         or a
  448.         jr nz,preparedrawspr_skip
  449.         ld a,l
  450.         cp 199+sprmaxhgt
  451.         jr nc,preparedrawspr_skip
  452.         sub sprmaxhgt-1
  453.         ;ld c,a
  454.          inc de
  455.          ld (de),a ;y = -(sprmaxhgt-1)..199 (кодируется как есть)
  456.          inc de
  457.         ld l,(ix+obj.animaddr16+0)
  458.         ld h,(ix+obj.animaddr16+1)
  459.         ld a,(hl) ;phase LSB
  460.         inc hl
  461.         ld h,(hl) ;phase HSB
  462.         ld l,a
  463.          ldi
  464.          ldi
  465.  
  466.         ld a,(ix+obj.animaddr16+0) ;TODO
  467. pg1=$+1
  468.         ld a,0
  469.          ld (de),a ;pg
  470.          inc de
  471. preparedrawspr_skip
  472.         ld bc,OBJSIZE
  473.         add ix,bc
  474.         jp preparedrawsprites0
  475. ;817000(prsprega)/793000(prspr)t на всё
  476. ;preparedrawspritesq
  477. ;        dec de
  478. ;        ld (drawsprites_data),de
  479. ;        ret ;jp setpgsmain40008000
  480.  
  481.         ;ld iy,(0xc000);testspr
  482.         ;ld e,110+(sprmaxwid-1) ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  483.         ;ld c,120 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  484.         ;call prsprega
  485.  
  486.         align 256
  487. spritesA
  488.         ds 1+5*51
  489.         align 256
  490. spritesB
  491.         ds 1+5*51
  492.         align 256
  493. spritesC
  494.         ds 1+5*51
  495.  
  496. drawsprites
  497. ;y,x,addr,pg - читаем с конца
  498. drawsprites_data=$+1
  499.         ld hl,0;sprlistA/B/C + ...
  500.         ;jr $
  501.         inc l
  502.         dec l
  503.         ret z ;no sprites
  504. drawsprites0
  505.         call setpgsscr40008000 ;предыдущий спрайт мог выключить, если был левее экрана и вообще не попал на экран? ;TODO если спрайт в границах экрана
  506.         ld a,(hl)
  507.         dec hl
  508.         call setpgc000
  509.         ld a,(hl)
  510.         ld hy,a
  511.         dec hl
  512.         ld a,(hl)
  513.         ld ly,a
  514.         dec hl
  515.         ld c,(hl) ;y
  516.         dec hl
  517.         ld e,(hl) ;x
  518.         push hl
  519. ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  520. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  521.         call prspr ;(без включения экранных страниц и без проверки попадания спрайта в экран) один спрайт 16x16 = 6408t (из них 4224t само мясо)
  522.         pop hl
  523.         dec l
  524.         jp nz,drawsprites0
  525.         jp setpgsmain40008000
  526.  
  527.         endif
  528.  
  529. getmousedelta
  530.         GET_KEY ;OS_GETKEYNOLANG
  531.         ld a,c ;keynolang
  532.         ;ld (key),a
  533.          jr nz,control_nofocus
  534. control_imer_oldmousecoords=$+1
  535.         ld bc,0
  536.         ld (control_imer_oldmousecoords),de
  537.         ld a,d;b
  538.         sub b;d
  539.         ld d,a
  540.         ld a,c;e
  541.         sub e;c
  542.         ld e,a
  543. control_nofocus
  544.         ;ld (control_imer_mousecoordsdelta),de
  545.         ret
  546.  
  547. loadpage
  548. ;заказывает страничку и грузит туда файл (имя файла в hl)
  549. ;out: hl=после имени файла, a=pg
  550.         push hl
  551.         OS_NEWPAGE
  552.         pop hl
  553.         ld a,e
  554.         push af ;pg
  555.         call setpgc000;SETPG32KHIGH
  556.         push hl
  557.         ex de,hl
  558.         OS_OPENHANDLE
  559.         push bc
  560.         ld de,0xc000 ;addr
  561.         ld hl,0x4000 ;size
  562.         OS_READHANDLE
  563.         pop bc
  564.         OS_CLOSEHANDLE                
  565.         pop hl
  566.         ld b,1
  567.         xor a
  568.         cpir ;after 0
  569.         pop af ;pg
  570.         ret
  571.  
  572.         include "pal.ast"
  573. ;SUMMERPAL
  574. ;DDp palette: %grbG11RB(low),%grbG11RB(high), инверсные
  575.         ;dw 0xffff,0xfefe,0x1d1d,0x3c3c,0xcdcd,0x4c4c,0x2c2c,0xecec
  576.         ;dw 0xfdfd,0x2d2d,0xeeee,0x3f3f,0xafaf,0x5d5d,0x4e4e,0x0c0c
  577. ;RSTPAL
  578. ;        STANDARDPAL
  579.  
  580.  
  581. primgega
  582. ;b=hgt,c=wid (/2)
  583. ;de=gfx
  584. ;hl=scr
  585.         push bc
  586.         call setpgsscr40008000
  587.         pop bc
  588. primgega0
  589.         push bc
  590.         ld hx,b
  591.         push hl
  592.         ld bc,40
  593. primgegacolumn0
  594.         ld a,(de)
  595.         inc de
  596.         ld (hl),a
  597.         add hl,bc
  598.         dec hx
  599.         jr nz,primgegacolumn0
  600.         pop hl
  601.         ld a,0x9f;0xa0
  602.         cp h
  603.         ld bc,0x4000
  604.         adc hl,bc
  605.         jp pe,primgegacolumn0q ;в половине случаев
  606. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  607.          inc a
  608.         xor h
  609.         ld h,a
  610. primgegacolumn0q
  611.         pop bc
  612.         dec c
  613.         jr nz,primgega0
  614.         jp setpgsmain40008000
  615.        
  616. prsprega
  617. ;iy=spr (+4)
  618. ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  619. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  620.         push bc
  621.         call setpgsscr40008000
  622.         pop bc      
  623.         ld a,e
  624.         cp scrwid+(sprmaxwid-1)
  625.         jr nc,noprspr
  626.         ld a,c
  627.         add a,sprmaxhgt-1
  628.         cp scrhgt+(sprmaxhgt-1)
  629.         call c,prspr
  630. noprspr
  631.         jp setpgsmain40008000
  632.  
  633. sfxplay
  634.         push af
  635. pgsfx=$+1
  636.         ld a,0
  637.         SETPG32KLOW
  638.         pop af
  639.         jp 0x8000 ;SFXPLAY
  640.  
  641.         include "int.asm"
  642.         include "cls.asm"
  643.         include "prspr.asm"
  644.         include "bgpush.asm"
  645.         include "bgpushxy.asm"
  646.         include "mem.asm"
  647.         include "bmp.asm"
  648.         include "logic.asm"
  649.         include "camera.asm"
  650.  
  651.         include "sprdata.asm"
  652.        
  653.         include "../../_sdk/file.asm"
  654.  
  655.         if DEBUGPRINT
  656. prcoords
  657.         call setpgsscr40008000
  658.         ld hl,(cameraxshift)
  659.         ld de,0x4000 + (192*40)
  660.         call prnum
  661.         ld hl,(objects+obj.xspeed16)
  662.         ld de,0x4008 + (192*40)
  663.         call prnum
  664.         ret
  665.  
  666. prnum
  667.         ld bc,10000
  668.         call prdig
  669.         ld bc,1000
  670.         call prdig
  671.         ld bc,100
  672.         call prdig
  673.         ld bc,10
  674.         call prdig
  675.         ld bc,1
  676. prdig
  677.         ld a,'0'-1
  678. prdig0
  679.         inc a
  680.         or a
  681.         sbc hl,bc
  682.         jr nc,prdig0
  683.         add hl,bc
  684.         ;push hl
  685.         ;call prchar
  686.         ;pop hl
  687.         ;ret
  688. prchar
  689. ;a=code
  690. ;de=screen
  691.         push de
  692.         push hl
  693.         call prcharin
  694.         pop hl
  695.         pop de
  696.         inc e
  697.         ret
  698.        
  699. calcscraddr
  700. ;bc=yx
  701. ;можно портить bc
  702.         ex de,hl
  703.         ld a,c ;x
  704.         ld l,b ;y
  705.         ld h,0
  706.         ld b,h
  707.         ld c,l
  708.         add hl,hl
  709.         add hl,hl
  710.         add hl,bc ;*5
  711.          add hl,hl
  712.          add hl,hl
  713.          add hl,hl ;*40
  714.          add hl,hl
  715.          add hl,hl
  716.          add hl,hl
  717.         add a,l
  718.         ld l,a
  719.         ld a,h
  720.         adc a,0x40
  721.         ld h,a
  722.         ex de,hl
  723.         ret
  724.  
  725. prcharxy
  726. ;a=code
  727. ;bc=yx
  728.         push de
  729.         push hl
  730.         push bc
  731.         push af
  732.         call calcscraddr
  733.         pop af
  734.         call prcharin
  735.         pop bc
  736.         pop hl
  737.         pop de
  738.         ret
  739.        
  740. prcharin
  741.         sub 32
  742.         ld l,a
  743.         ld h,0
  744.          add hl,hl
  745.          add hl,hl
  746.          add hl,hl
  747.          add hl,hl
  748.          add hl,hl
  749.         ;ld bc,font-(32*32)
  750.         ;add hl,bc
  751.         ld a,h
  752.         add a,font/256
  753.         ld h,a
  754. prcharin_go
  755.         ex de,hl
  756.        
  757.         ld bc,40
  758.         push hl
  759.         push hl
  760.         dup 8
  761.         ld a,(de) ;font
  762.         ld (hl),a ;scr
  763.         inc de
  764.         add hl,bc
  765.         edup
  766.         pop hl
  767.         ;set 6,h
  768.          ld a,h
  769.          add a,0x40
  770.          ld h,a
  771.         ;ld d,font/256
  772.         dup 8
  773.         ld a,(de) ;font
  774.         ld (hl),a ;scr
  775.         inc de
  776.         add hl,bc
  777.         edup
  778.         pop hl
  779.         set 5,h
  780.         push hl
  781.         ;ld d,font/256
  782.         dup 8
  783.         ld a,(de) ;font
  784.         ld (hl),a ;scr
  785.         inc de
  786.         add hl,bc
  787.         edup
  788.         pop hl
  789.         ;set 6,h
  790.          ld a,h
  791.          add a,0x40
  792.          ld h,a
  793.         ;ld d,font/256
  794.         dup 8
  795.         ld a,(de) ;font
  796.         ld (hl),a ;scr
  797.         inc de
  798.         add hl,bc
  799.         edup        
  800.         ret
  801.         endif
  802.  
  803. genpush_newpage
  804. ;заказывает страницу, заносит в tpushpgs, a=pg
  805.         push bc
  806.         push de
  807.         push hl
  808.         push ix
  809.         OS_NEWPAGE
  810.         pop ix
  811.         ld a,e
  812.         ld (ix),a
  813.         ld de,4
  814.         add ix,de
  815.         pop hl
  816.         pop de
  817.         pop bc
  818.         ret
  819.  
  820.         if DEBUGPRINT
  821.         align 256
  822. font
  823.         incbin "fontgfx"
  824.         endif
  825.        
  826. res_path
  827.         db "sprexamp",0 ;в этом относительном пути будут лежать все загружаемые данные игры
  828. bgfilename
  829.         db "bg6-16c.bmp",0
  830. bgxyfilename
  831.         db "bg8-16d.bmp",0
  832.  
  833. tilefilename
  834.         db "tiles.bin",0
  835. tilebmpfilename
  836.         db "tiles1.bmp",0
  837. tilemapfilename
  838.         db "map1.map",0
  839. enemymapfilename
  840.         db "map1.enm",0
  841.  
  842.  
  843. TILEMAP
  844.         ds TILEMAPWID*TILEMAPHGT ;снизу вверх, справа налево
  845.  
  846. tpushpgs
  847.         ds 128 ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...
  848.  
  849.         align 256
  850. trecodebyteleft
  851.         dup 256
  852. ;%00003210 => %.3...210
  853. _3=$&8
  854. _210=$&7
  855.         db (_3*0x08) + (_210*0x01)
  856.         edup
  857.        
  858. trecodebyteright
  859.         dup 256
  860. ;%00003210 => %3.210...
  861. _3=$&8
  862. _210=$&7
  863.         db (_3*0x10) + (_210*0x08)
  864.         edup
  865.  
  866. bgpush_bmpbuf=0x4000 ;ds 1024;320 ;заголовок bmp или одна строка
  867. bgpush_loadbmplinestack=bgpush_bmpbuf+1024 ;ds pushhgt*2+32
  868.  
  869.         include "init.asm"
  870.  
  871. end        
  872.  
  873.         display "begin=",begin
  874.         display "end=",end
  875.         display "Size ",/d,end-begin," bytes"
  876.        
  877.         savebin "sprexamp.com",begin,end-begin
  878.        
  879.         LABELSLIST "../../../us/user.l"
  880.