?login_element?

Subversion Repositories NedoOS

Rev

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

  1. uvscroll_prepare
  2.  
  3.         ld ix,tpushpgs
  4.         call uvscroll_genpush
  5.         ;ld ix,tpushpgs+1
  6.         call uvscroll_genpush
  7.         ;ld ix,tpushpgs+2
  8.         call uvscroll_genpush
  9.         ;ld ix,tpushpgs+3
  10.         call uvscroll_genpush
  11.  
  12. ;зациклим страницы (UVSCROLL_HGT/64 страниц в каждом слое)
  13.         ld hl,tpushpgs
  14.         ld de,tpushpgs+(UVSCROLL_HGT/64*4)
  15.         ld bc,UVSCROLL_HGT/64*4 ;4*4 ;на высоту экрана
  16.         ldir
  17.  
  18.         jp uvscroll_gencall
  19.  
  20.        if 0
  21. uvscroll_preparetiles
  22. ;tile gfx
  23.         OS_NEWPAGE
  24.         ld a,e
  25.         ld (pgtilegfx),a
  26.         SETPG32KLOW
  27.         OS_NEWPAGE
  28.         ld a,e
  29.         ld (pgtilegfx2),a
  30.         SETPG32KHIGH
  31.  
  32.         ld de,tilebmpfilename
  33.         call openstream_file
  34.         call readbmphead_pal
  35.         call closestream_file
  36.        
  37.         ld de,tilefilename
  38.         call openstream_file
  39.  
  40.         ld l,0
  41. uvscroll_preparetiles0
  42.         push hl
  43.         ld de,bgpush_bmpbuf
  44.         ld hl,128 ;one metatile
  45. ;de=buf
  46. ;hl=size
  47.         push de
  48.         call readstream_file
  49.         pop de
  50.         pop hl
  51.         ld h,0x80+15+16
  52.         call uvscroll_preparetiles_copy4columns
  53.         ld h,0x80+15
  54.         call uvscroll_preparetiles_copy4columns
  55.         inc l
  56.         jr nz,uvscroll_preparetiles0
  57.  
  58.         jp closestream_file
  59.  
  60. uvscroll_preparetiles_copy4columns
  61.         call uvscroll_preparetiles_copy2columns
  62. uvscroll_preparetiles_copy2columns
  63.         call uvscroll_preparetiles_copycolumn
  64. uvscroll_preparetiles_copycolumn
  65.         ld b,16
  66. uvscroll_preparetiles_copycolumn0
  67.         ld a,(de)
  68.         ld (hl),a
  69.         inc de
  70.         dec h
  71.         djnz uvscroll_preparetiles_copycolumn0
  72.         ld a,h
  73.         add a,32+16
  74.         ld h,a
  75.         ret
  76.  
  77. uvscroll_preparetilemap
  78. ;tilemap
  79.         OS_NEWPAGE
  80.         ld a,e
  81.         ld (pgmetatilemap),a
  82.         SETPG32KHIGH
  83.  
  84.         ld de,tilemapfilename
  85.         call openstream_file
  86.         ld de,0xc000;0xe000
  87.         ld hl,0x4000;0x2000
  88. ;de=buf
  89. ;hl=size
  90.         call readstream_file        
  91.         call closestream_file
  92.  
  93.         if 1==0
  94. ;перекодируем метатайлы из 2-байтового представления в 1-байтовое
  95. ;и переворачиваем, чтобы было снизу вверх, справа налево (в соответствии с ldpush)
  96.         ld hl,0xc000
  97.         ld de,0xffff&(0xe000+0x2000)
  98.         ld bc,0x2000/2
  99. uvscroll_preparetilemap_remetatiles0
  100.         dec de
  101.         ld a,(de)
  102.         ld hx,a
  103.         dec de
  104.         ld a,(de)
  105.         ld lx,a
  106.         add ix,ix
  107.         add ix,ix
  108.         add ix,ix
  109.         ld a,hx
  110.         ld (hl),a
  111.         cpi
  112.         jp pe,uvscroll_preparetilemap_remetatiles0
  113.         endif
  114.  
  115.         call uvscroll_filltilemap
  116.         jp uvscroll_showtilemap
  117.        
  118. uvscroll_showtilemap_counthlde
  119.         ld hl,(allscroll)
  120. ;округлить до целого метатайла в зависимости от yscroll&15 (в самом allscroll нет этой информации)
  121. ;т.е. hl-=(yscroll&15)*(UVSCROLL_WID/512)
  122.         ld a,(yscroll)
  123.         and 15
  124.         cpl
  125.         ld c,a
  126.         ld b,-1
  127.         inc bc ;bc<=0
  128.         dup UVSCROLL_WID/512
  129.         add hl,bc
  130.         edup
  131.          ld a,h
  132.          and +(UVSCROLL_HGT/256)*(UVSCROLL_WID/512)-1
  133.          ld h,a
  134.         ld a,(allscroll_lsb)
  135.         ld c,a
  136.         rra
  137.         rra
  138.         cpl
  139.         and 3*2
  140. ;de=TILEMAP-(((x2scroll/8)&3)*2) в зависимости от x2scroll:
  141.         ld de,TILEMAP-6
  142.         add a,e
  143.         ld e,a
  144.         jr nc,$+3
  145.         inc d
  146.         ret
  147.  
  148. uvscroll_showtilemap
  149. ;выводим текущий tilemap в ldpush
  150.         call uvscroll_showtilemap_counthlde
  151. ;как выводим относительно TILEMAP: (сначала показаны правые знакоместа)
  152. ;x2scroll=0:
  153. ;[......][......][......][......][......][......][......][......]
  154. ;sSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSs
  155. ;x2scroll=8 (go left):
  156. ;.....][......][......][......][......][......][......][......]
  157. ;sSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSs
  158. ;x2scroll=16 (go left):
  159. ;...][......][......][......][......][......][......][......]
  160. ;sSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSs
  161. ;x2scroll=24 (go left):
  162. ;.][......][......][......][......][......][......][......]
  163. ;sSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSs
  164.         ld b,TILEMAPHGT/2
  165. uvscroll_showtilemap_b
  166. ;hl=allscroll-(yscroll&15)*(UVSCROLL_WID/512)
  167. ;de=TILEMAP-(((x2scroll/8)&3)*2) в зависимости от x2scroll
  168. ;b=hgt
  169. ;c=allscroll_lsb
  170.         ld a,c;(allscroll_lsb)
  171.         and 0xe0 ;округлить до x/64 = x2/32
  172. uvscroll_showtilemap0
  173.         push af
  174.         push bc
  175.         push de
  176.         push hl
  177.  
  178.         ld b,48/8 ;b=число блоков по 8 тайлов
  179.         push af
  180.         push bc
  181.         push de
  182.         push hl
  183.         ex af,af'
  184.        ld a,TILEGFX/256
  185.        ld (drawtiles_hor_block_tilegfx),a
  186.        ex af,af'
  187. ;de=tilemap+
  188. ;hla=allscroll
  189.         call drawtiles_hor_hla_de
  190.         pop hl
  191.         ld bc,8*(UVSCROLL_WID/512)
  192.         add hl,bc ;y*2
  193.         pop de
  194.         pop bc
  195.         ld a,TILEGFX/256+8
  196.         ld (drawtiles_hor_block_tilegfx),a
  197.         pop af
  198. ;de=tilemap+
  199. ;hla=allscroll
  200.         call drawtiles_hor_hla_de
  201.        
  202.         pop hl
  203.         ld bc,16*(UVSCROLL_WID/512)
  204.         add hl,bc ;y*(UVSCROLL_WID/512)
  205.         pop de ;tilemap
  206.         ex de,hl
  207.         ld bc,TILEMAPWID*2
  208.         add hl,bc
  209.         ex de,hl
  210.         pop bc
  211.         pop af
  212.         djnz uvscroll_showtilemap0
  213.         ret
  214.        endif
  215.        
  216.         if 1==0
  217. ;выводим tilemap 64x32 в ldpush (для сверхбыстрых маленьких уровней? там отключить обновление через tilemap и подрисовку столбцов)
  218. uvscroll_showmetatilemap
  219.         ld hl,0 ;y*(UVSCROLL_WID/512)
  220.         ld de,0xc000;+0x0800 ;metatilemap
  221.         ld b,UVSCROLL_HGT/16
  222. uvscroll_showmetatilemap0
  223.         push bc
  224.         push de
  225.         push hl
  226.  
  227.         push hl
  228.         ld a,(pgmetatilemap)
  229.         SETPG32KHIGH
  230.         ld hl,bgpush_bmpbuf;TILEMAP
  231.         push hl
  232.         ld b,UVSCROLL_WID/16
  233. uvscroll_gettilemapline0
  234.         ld a,(de)
  235.         inc de
  236.         ld (hl),a
  237.         inc hl
  238.         ld (hl),a
  239.         inc hl
  240.         djnz uvscroll_gettilemapline0
  241.         pop de ;TILEMAP
  242.         pop hl
  243.  
  244.         ld b,128/8 ;b=число блоков по 8 тайлов
  245.         push bc
  246.         push de
  247.         push hl
  248.         ld a,TILEGFX/256
  249.         ld (drawtiles_hor_block_tilegfx),a
  250.         xor a
  251. ;de=tilemap+
  252. ;hla=allscroll
  253.         call drawtiles_hor_hla_de
  254.         pop hl
  255.         ld bc,8*(UVSCROLL_WID/512)
  256.         add hl,bc ;y*2
  257.         pop de
  258.         pop bc
  259.         ld a,TILEGFX/256+8
  260.         ld (drawtiles_hor_block_tilegfx),a
  261.         xor a ;x=0
  262. ;de=tilemap+
  263. ;hla=allscroll
  264.         call drawtiles_hor_hla_de
  265.        
  266.         pop hl
  267.         ld bc,16*(UVSCROLL_WID/512)
  268.         add hl,bc ;y*(UVSCROLL_WID/512)
  269.         pop de ;metatilemap
  270.         ex de,hl
  271.         ld bc,METATILEMAPWID
  272.         add hl,bc
  273.         ex de,hl
  274.         pop bc
  275.         djnz uvscroll_showmetatilemap0
  276.         ret
  277.         endif
  278.  
  279. uvscroll_preparebmp
  280. ;de=filename
  281.         call openstream_file
  282.  
  283.         call readbmphead_pal
  284.  
  285. ;загрузить графику bmp в ld-push
  286.         ld ix,tpushpgs
  287.         ld hl,uvscroll_pushbase
  288.         ld bc,UVSCROLL_HGT
  289. uvscroll_ldbmp0
  290.         ;ld a,UVSCROLL_WID/8/2
  291.         ;ld a,512/8/2
  292.        ;ld a,320/8/2
  293.        ld a,(bmpwid)
  294.         call bgpush_ldbmp_line
  295.         ;ld de,PUSHLINESZ
  296.         ;add hl,de
  297.         inc h
  298.         ld a,h
  299.         cp uvscroll_pushbase/256+64;63
  300.         jr nz,uvscroll_ldbmp0_nonextpg
  301.         ld h,uvscroll_pushbase/256
  302.         ld de,4
  303.         add ix,de
  304. uvscroll_ldbmp0_nonextpg
  305.         dec bc
  306.         ld a,b
  307.         or c
  308.         jr nz,uvscroll_ldbmp0
  309.         call closestream_file
  310. uvscroll_restorememmap
  311.         call RestoreMemMap3
  312.         jp setpgsmain40008000
  313.  
  314. uvscroll_setscroll
  315. ;hl=y
  316. ;de=x
  317.         srl d
  318.         rr e
  319.        ;ld bc,200-1
  320.        ;add hl,bc
  321.         ld a,h
  322.         cpl
  323.         and 1
  324.         ld h,a
  325.         ld a,l
  326.         cpl
  327.         ld l,a
  328.        if UVSCROLL_WID==1024
  329.         add hl,hl
  330.        endif
  331.         ld a,d
  332.         add a,l
  333.         ld l,a
  334.         ld a,e
  335.         ld (allscroll_lsb),a
  336.         ld (allscroll),hl
  337.         ret
  338.  
  339. uvscroll_scroll
  340. ;de=delta (d>0: go up) (e>0: go left)
  341.         push de
  342.         ld a,e
  343.         call uvscroll_scroll_x
  344.         pop af
  345.         jp uvscroll_scroll_y
  346.  
  347.        if 0
  348. uvscroll_scrolltiles
  349. ;scroll by metatile
  350. ;hx=delta y (>0: go up)
  351. ;lx=delta x (>0: go left)
  352.         call uvscroll_scrolltilemap ;делаем этот ldir/lddr только один раз для двух координат
  353. ;подкачать появившиеся строки:
  354.         ld a,hx ;delta y (>0: go up)
  355.         or a
  356.         jr z,uvscrollloop_ynupd
  357.         jp m,uvscrollloop_yupddown
  358.          cp TILEMAPHGT /2
  359.          jr c,uvscrollloop_yupdup_nallscr
  360.          ld hx,TILEMAPHGT /2 ;весь экран будет подкачан
  361. uvscrollloop_yupdup_nallscr
  362.         call countmetatilemap ;hl=metatilemap + (yscroll/16*METATILEMAPWID) + (x2scroll/8)
  363.         ld bc,+(TILEMAPHGT/2-1)*METATILEMAPWID
  364.         add hl,bc
  365.         ld de,TILEMAP+((TILEMAPHGT-2)*TILEMAPWID)
  366. uvscrollloop_yupdup0
  367. ;de=tilemap+
  368. ;hl=metatilemap+
  369.         push de
  370.         push hl
  371.         call uvscroll_filltilemap_line ;заполнение одной двойной строки TILEMAP из карты
  372.         pop hl
  373.         pop de
  374.         ld bc,-METATILEMAPWID
  375.         add hl,bc
  376.         ex de,hl
  377.         ld bc,-TILEMAPWID*2
  378.         add hl,bc
  379.         ex de,hl
  380.         dec hx
  381.         jr nz,uvscrollloop_yupdup0        
  382.         jr uvscrollloop_ynupd
  383. uvscrollloop_yupddown
  384.          cp -(TILEMAPHGT /2)
  385.          jr nc,uvscrollloop_yupddown_nallscr
  386.          ld hx,-(TILEMAPHGT /2) ;весь экран будет подкачан
  387. uvscrollloop_yupddown_nallscr
  388.         call countmetatilemap ;hl=metatilemap + (yscroll/16*METATILEMAPWID) + (x2scroll/8)
  389.         ld de,TILEMAP
  390. uvscrollloop_yupddown0
  391. ;de=tilemap+
  392. ;hl=metatilemap+
  393.         push de
  394.         push hl
  395.         call uvscroll_filltilemap_line ;заполнение одной двойной строки TILEMAP из карты
  396.         pop hl
  397.         pop de
  398.         ld bc,METATILEMAPWID
  399.         add hl,bc
  400.         ex de,hl
  401.         ld bc,TILEMAPWID*2
  402.         add hl,bc
  403.         ex de,hl
  404.         inc hx
  405.         jr nz,uvscrollloop_yupddown0
  406. uvscrollloop_ynupd
  407.  
  408. ;подкачать появившиеся столбцы:
  409.         ld a,lx ;delta x (>0: go left)
  410.         or a
  411.         jr z,uvscrollloop_xnupd
  412.         jp m,uvscrollloop_xupdright
  413.          cp TILEMAPWID /2
  414.          jr c,uvscrollloop_xupdleft_nallscr
  415.          ld lx,TILEMAPWID /2 ;весь экран будет подкачан
  416. uvscrollloop_xupdleft_nallscr
  417.         call countmetatilemap ;hl=metatilemap + (yscroll/16*METATILEMAPWID) + (x2scroll/8)
  418.         ld bc,TILEMAPWID/2-1
  419.         add hl,bc
  420.         ld de,TILEMAP+TILEMAPWID-2
  421. uvscrollloop_xupdleft0
  422. ;de=tilemap+
  423. ;hl=metatilemap+
  424.         push de
  425.         push hl
  426.         call uvscroll_filltilemap_column ;заполнение одного двойного столбца TILEMAP из карты
  427.         pop hl
  428.         pop de
  429.         dec hl
  430.         dec de
  431.         dec de
  432.         dec lx
  433.         jr nz,uvscrollloop_xupdleft0        
  434.         jr uvscrollloop_xnupd
  435. uvscrollloop_xupdright
  436.          cp -(TILEMAPWID /2)
  437.          jr nc,uvscrollloop_xupdright_nallscr
  438.          ld lx,-(TILEMAPWID /2) ;весь экран будет подкачан
  439. uvscrollloop_xupdright_nallscr
  440.         call countmetatilemap ;hl=metatilemap + (yscroll/16*METATILEMAPWID) + (x2scroll/8)
  441.         ld de,TILEMAP
  442. uvscrollloop_xupdright0
  443. ;de=tilemap+
  444. ;hl=metatilemap+
  445.         push de
  446.         push hl
  447.         call uvscroll_filltilemap_column ;заполнение одного двойного столбца TILEMAP из карты
  448.         pop hl
  449.         pop de
  450.         inc hl
  451.         inc de
  452.         inc de
  453.         inc lx
  454.         jr nz,uvscrollloop_xupdright0
  455. uvscrollloop_xnupd
  456.  
  457. ;draw by tile
  458. ;hy=delta y (>0: go up) надо отрисовать все появившиеся строки
  459.         ld hl,(allscroll)
  460. ;округлить до целого тайла в зависимости от yscroll&7 (в самом allscroll нет этой информации)
  461. ;т.е. hl-=(yscroll&7)*(UVSCROLL_WID/512)
  462.         ld a,(yscroll)
  463.         and 7
  464.         cpl
  465.         ld c,a
  466.         ld b,-1
  467.         inc bc ;bc<=0
  468.         dup UVSCROLL_WID/512
  469.         add hl,bc
  470.         edup
  471.  
  472. ;как выводим относительно TILEMAP: (сначала показаны правые знакоместа)
  473. ;x2scroll=0:
  474. ;[......][......][......][......][......][......][......][......]
  475. ;sSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSs
  476. ;x2scroll=8 (go left):
  477. ;.....][......][......][......][......][......][......][......]
  478. ;sSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSs
  479. ;x2scroll=16 (go left):
  480. ;...][......][......][......][......][......][......][......]
  481. ;sSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSs
  482. ;x2scroll=24 (go left):
  483. ;.][......][......][......][......][......][......][......]
  484. ;sSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSs
  485. ;de+=TILEMAPWID при yscroll&8 ;TODO перетащить до ветвления, если это верно и одинаково для обеих веток
  486.         ld de,TILEMAP-6
  487.         ld a,(yscroll)
  488.         and 8
  489.         jr z,uvscrollloop_ydrawup_nodd
  490.         ld de,TILEMAP-6 +TILEMAPWID
  491. uvscrollloop_ydrawup_nodd
  492.         or TILEGFX/256
  493.         ld (drawtiles_hor_block_tilegfx),a
  494.  
  495.         ld a,(allscroll_lsb)
  496.         rra
  497.         rra
  498.         cpl
  499.         and 3*2
  500. ;de=TILEMAP-(((x2scroll/8)&3)*2) в зависимости от x2scroll:
  501.         add a,e
  502.         ld e,a
  503.         jr nc,$+3
  504.         inc d
  505.  
  506.         ld a,hy ;delta y (>0: go up)
  507.         or a
  508.         jp z,uvscrollloop_yndraw
  509.         jp m,uvscrollloop_ydrawdown
  510. ;строки из конца TILEMAP или +TILEMAPWID (если yscroll&8)
  511. ;рисуем их в ldpush на UVSCROLL_SCRHGT выше текущей округлённой базы
  512.           ld bc,+(UVSCROLL_SCRHGT)*(UVSCROLL_WID/512)
  513.           add hl,bc
  514.          ld a,h
  515.          and +(UVSCROLL_HGT/256)*(UVSCROLL_WID/512)-1
  516.          ld h,a
  517.  
  518.         ex de,hl
  519.         ld bc,+(TILEMAPHGT-2)*TILEMAPWID
  520.         add hl,bc
  521.         ex de,hl
  522.  
  523.         ld a,(allscroll_lsb)
  524.         and 0xe0 ;округлить до x/64 = x2/32
  525.        
  526. uvscrollloop_ydrawup0
  527. ;de=tilemap+
  528. ;hla=allscroll+
  529.         push af
  530.         push de
  531.         push hl
  532.         ld b,6 ;число блоков по 8 тайлов
  533.         call drawtiles_hor_hla_de ;заполнение одной строки тайлов ldpush из TILEMAP
  534.         ld hl,drawtiles_hor_block_tilegfx
  535.         ld a,(hl)
  536.         xor 8
  537.         ld (hl),a ;верхняя/нижняя половинка метатайла
  538.         pop hl
  539.         pop de
  540.         ld bc,-8*(UVSCROLL_WID/512)
  541.         add hl,bc ;следующая тайловая строка в ldpush
  542.          ld a,h
  543.          and +(UVSCROLL_HGT/256)*(UVSCROLL_WID/512)-1
  544.          ld h,a
  545.         pop af
  546.         ex de,hl
  547.         ld bc,-TILEMAPWID
  548.         add hl,bc ;следующая тайловая строка в tilemap
  549.         ex de,hl
  550.         dec hy
  551.         jr nz,uvscrollloop_ydrawup0        
  552.         jr uvscrollloop_yndraw
  553. uvscrollloop_ydrawdown
  554. ;строки из начала TILEMAP или +TILEMAPWID (если yscroll&8)
  555. ;рисуем их в ldpush на уровне текущей округлённой базы
  556.          ld a,h
  557.          and +(UVSCROLL_HGT/256)*(UVSCROLL_WID/512)-1
  558.          ld h,a
  559.  
  560.         ld a,(allscroll_lsb)
  561.         and 0xe0 ;округлить до x/64 = x2/32
  562.  
  563. uvscrollloop_ydrawdown0
  564. ;de=tilemap+
  565. ;hla=allscroll+
  566.         push af
  567.         push de
  568.         push hl
  569.         ld b,6 ;число блоков по 8 тайлов
  570.         call drawtiles_hor_hla_de ;заполнение одной строки тайлов ldpush из TILEMAP
  571.         ld hl,drawtiles_hor_block_tilegfx
  572.         ld a,(hl)
  573.         xor 8
  574.         ld (hl),a ;верхняя/нижняя половинка метатайла
  575.         pop hl
  576.         pop de
  577.         ld bc,8*(UVSCROLL_WID/512)
  578.         add hl,bc ;следующая тайловая строка в ldpush
  579.          ld a,h
  580.          and +(UVSCROLL_HGT/256)*(UVSCROLL_WID/512)-1
  581.          ld h,a
  582.         pop af
  583.         ex de,hl
  584.         ld bc,TILEMAPWID
  585.         add hl,bc ;следующая тайловая строка в tilemap
  586.         ex de,hl
  587.         inc hy
  588.         jr nz,uvscrollloop_ydrawdown0
  589. uvscrollloop_yndraw
  590.  
  591. ;ly=delta x (>0: go left) надо отрисовать все появившиеся столбцы
  592.         ld hl,(allscroll)
  593. ;округлить до целого метатайла в зависимости от yscroll&15 (в самом allscroll нет этой информации)
  594. ;т.е. hl-=(yscroll&15)*(UVSCROLL_WID/512)
  595.         ld a,(yscroll)
  596.         and 15
  597.         cpl
  598.         ld c,a
  599.         ld b,-1
  600.         inc bc ;bc<=0
  601.         dup UVSCROLL_WID/512
  602.         add hl,bc
  603.         edup
  604.          ld a,h
  605.          and +(UVSCROLL_HGT/256)*(UVSCROLL_WID/512)-1
  606.          ld h,a
  607.  
  608.         ld de,TILEMAP
  609. ;de++ при x2scroll&4
  610.         ld a,(x2scroll)
  611.         and 4
  612.         ld a,TILEGFX/256
  613.         jr z,uvscrollloop_xdraw_nodd
  614.         inc de
  615.         add a,16
  616. uvscrollloop_xdraw_nodd
  617.         ld (drawtiles_ver_block_tilegfx),a
  618.  
  619.         ld a,ly ;delta x (>0: go left)
  620.         or a
  621.         jp z,uvscrollloop_xndraw
  622.         jp m,uvscrollloop_xdrawright
  623. ;столбцы из TILEMAP+TILEMAPWID-2 или +1 (если x2scroll&4)
  624. ;рисуем их в ldpush на уровне текущей округлённой базы +((TILEMAPWID-2)*4)
  625.         ex de,hl
  626.         ld bc,TILEMAPWID-2
  627.         add hl,bc
  628.         ex de,hl        
  629.         ld a,(allscroll_lsb)
  630.         and 0xfc ;округлить до x/8 = x2/4
  631.         add a,+((TILEMAPWID-2)*4)
  632.         jr nc,uvscrollloop_xdrawleft_nincallscroll
  633.         inc hl
  634.         ex af,af'
  635.         ld a,h
  636.         and +(UVSCROLL_HGT/256)*(UVSCROLL_WID/512)-1
  637.         ld h,a
  638.        ex af,af'
  639. uvscrollloop_xdrawleft_nincallscroll
  640.         ld b,ly
  641. uvscrollloop_xdrawleft0
  642. ;de=tilemap+
  643. ;hla=allscroll+
  644.         push bc
  645.         push af
  646.         push de
  647.         push hl
  648.         ld b,3 ;число блоков по 8 тайлов
  649.         call drawtiles_ver_hla_de
  650.         ld hl,drawtiles_ver_block_tilegfx
  651.         ld a,(hl)
  652.         xor 16
  653.         ld (hl),a ;левая/правая половинка метатайла
  654.         pop hl
  655.         pop de
  656.         dec de
  657.         pop af
  658.         sub 4
  659.         jr nc,uvscrollloop_xdrawleft0_ndecallscroll
  660.         dec hl
  661.         ex af,af'
  662.         ld a,h
  663.         and +(UVSCROLL_HGT/256)*(UVSCROLL_WID/512)-1
  664.         ld h,a
  665.        ex af,af'
  666. uvscrollloop_xdrawleft0_ndecallscroll
  667.         pop bc
  668.         djnz uvscrollloop_xdrawleft0
  669.         jr uvscrollloop_xndraw
  670. uvscrollloop_xdrawright
  671. ;столбцы из начала TILEMAP или +1 (если x2scroll&4)
  672. ;рисуем их в ldpush на уровне текущей округлённой базы
  673.         ld a,(allscroll_lsb)
  674.         and 0xfc ;округлить до x/8 = x2/4
  675.         ld b,ly
  676. uvscrollloop_xdrawright0
  677. ;de=tilemap+
  678. ;hla=allscroll+
  679.         push bc
  680.         push af
  681.         push de
  682.         push hl
  683.         ld b,3 ;число блоков по 8 тайлов
  684.         call drawtiles_ver_hla_de
  685.         ld hl,drawtiles_ver_block_tilegfx
  686.         ld a,(hl)
  687.         xor 16
  688.         ld (hl),a ;левая/правая половинка метатайла
  689.         pop hl
  690.         pop de
  691.         inc de
  692.         pop af
  693.         add a,4
  694.         jr nc,uvscrollloop_xdrawright0_nincallscroll
  695.         inc hl
  696.         ex af,af'
  697.         ld a,h
  698.         and +(UVSCROLL_HGT/256)*(UVSCROLL_WID/512)-1
  699.         ld h,a
  700.        ex af,af'
  701. uvscrollloop_xdrawright0_nincallscroll
  702.         pop bc
  703.         inc b
  704.         jr nz,uvscrollloop_xdrawright0
  705. uvscrollloop_xndraw
  706.         ret;jp uvscrollloop0
  707.  
  708. drawtile_toldpush
  709. ;de=tilemap+
  710. ;hla=allscroll+
  711.         ld b,1 ;число блоков по 8 тайлов
  712.         jp drawtiles_ver_hla_de
  713.        endif
  714.  
  715. uvscroll_scroll_x
  716. ;a>0 = go left
  717.         ld hl,(x2scroll)
  718.         ld c,a
  719.          ld a,l
  720.          and 0xfc
  721.          ld d,a
  722.          and 0xf8
  723.          ld e,a
  724.         ld a,(allscroll_lsb)
  725.         bit 7,c
  726.         jr nz,uvscroll_scroll_x_minus
  727. ;uvscroll_scroll_x_plus
  728.         ld b,0
  729.         add hl,bc
  730.         ;ld bc,+(UVSCROLL_WID-UVSCROLL_SCRWID)/2
  731.         ;or a
  732.         ;sbc hl,bc
  733.         ;add hl,bc
  734.         ;jr c,$+4
  735.         ;ld h,b
  736.         ;ld l,c
  737.         add a,c
  738.         ld bc,(allscroll)
  739.         jr nc,$+3
  740.         inc bc
  741. uvscroll_scroll_x_q
  742.         ld (allscroll_lsb),a
  743.          ld a,b
  744.          and +(UVSCROLL_HGT/256)*(UVSCROLL_WID/512)-1
  745.          ld b,a
  746.         ld (allscroll),bc
  747.         ld (x2scroll),hl ;чем больше, тем более левая часть карты
  748.          ld a,l
  749.          and 0xf8
  750.          sub e
  751.         sra a
  752.         sra a
  753.         sra a ;a=число левых (с минусом - правых) столбцов, которые надо подкачать (изменился x2scroll/8)
  754.         ld lx,a
  755.          ld a,l
  756.          and 0xfc
  757.          sub d
  758.         sra a
  759.         sra a ;a=число левых (с минусом - правых) столбцов, которые надо подрисовать (изменился x2scroll/4)
  760.         ld ly,a
  761.         ret
  762.        
  763. uvscroll_scroll_x_minus
  764.         ld b,-1
  765.         add hl,bc
  766.          ;bit 7,h
  767.          ;jr z,$+5
  768.          ;ld hl,0 ;сбивает фазу относительно allscroll!
  769.         add a,c
  770.         ld bc,(allscroll)
  771.         jr c,uvscroll_scroll_x_q;$+3
  772.         dec bc
  773.         jr uvscroll_scroll_x_q
  774.        
  775. uvscroll_scroll_y
  776. ;a>0 = go up
  777.         ld hl,(yscroll)
  778.         ld c,a
  779.          ld a,l
  780.          and 0xf8
  781.          ld d,a
  782.          and 0xf0
  783.          ld e,a
  784.         bit 7,c
  785.         jr nz,uvscroll_scroll_y_minus
  786. ;uvscroll_scroll_y_plus
  787.         ld b,0
  788.         add hl,bc
  789.         ;ld de,UVSCROLL_HGT-UVSCROLL_SCRHGT
  790.         ;or a
  791.         ;sbc hl,de
  792.         ;add hl,de
  793.         ;jr c,$+3
  794.         ;ex de,hl
  795. uvscroll_scroll_y_q
  796.         push hl
  797.         ld hl,(allscroll)
  798.         dup UVSCROLL_WID/512
  799.         add hl,bc
  800.         edup
  801.          ld a,h
  802.          and +(UVSCROLL_HGT/256)*(UVSCROLL_WID/512)-1
  803.          ld h,a
  804.         ld (allscroll),hl
  805.         pop hl
  806.         ld (yscroll),hl ;чем больше, тем более верхняя часть карты
  807.          ld a,l
  808.          and 0xf0
  809.          sub e
  810.         sra a
  811.         sra a
  812.         sra a
  813.         sra a ;a=число верхних (с минусом - нижних) строк, которые надо подкачать (изменился yscroll/16)
  814.         ld hx,a
  815.          ld a,l
  816.          and 0xf8
  817.          sub d
  818.         sra a
  819.         sra a
  820.         sra a ;a=число верхних (с минусом - нижних) строк, которые надо подрисовать (изменился yscroll/8)
  821.         ld hy,a
  822.         ret
  823.        
  824. uvscroll_scroll_y_minus
  825.         ld b,-1
  826.         add hl,bc
  827.          ;bit 7,h
  828.          ;jr z,$+5
  829.          ;ld hl,0 ;сбивает фазу относительно allscroll!
  830.         jr uvscroll_scroll_y_q
  831.  
  832.        if 0
  833. ;процедура скроллинга буфера tilemap (содержит номера тайлов в видимой части карты, снизу вверх, справа налево)
  834. uvscroll_scrolltilemap
  835. ;hx=delta y (>0: go up)
  836. ;lx=delta x (>0: go left)
  837. ;скроллим ровно вдвое больше!!!
  838.         ld a,hx
  839.         or lx
  840.         ret z
  841.         ld hl,TILEMAP ;from
  842.         ld d,h
  843.         ld e,l        ;to
  844.         ld bc,TILEMAPWID *2 ;b=0!!!
  845.         exx
  846.         ld hl,TILEMAPHGT*TILEMAPWID ;size
  847.         ld bc,-TILEMAPWID *2
  848.         exx
  849.         ld a,hx
  850.         or a
  851.         jr z,uvscroll_scrolltilemap_dyq
  852.         jp m,uvscroll_scrolltilemap_dyneg
  853.          cp TILEMAPHGT /2
  854.          ret nc ;скроллить весь экран или даже больше бессмысленно - весь экран будет подкачан
  855. ;dy>0: go up (удалить начальную часть tilemap): hl+=dy*TILEMAPWID *2, hl'-=dy*TILEMAPWID *2
  856. uvscroll_scrolltilemap_dypos0
  857.         add hl,bc ;from
  858.         exx
  859.         add hl,bc ;size
  860.         exx
  861.         dec a
  862.         jr nz,uvscroll_scrolltilemap_dypos0
  863.         jr uvscroll_scrolltilemap_dyq
  864. uvscroll_scrolltilemap_dyneg
  865.          cp -(TILEMAPHGT /2 +1)
  866.          ret c ;скроллить весь экран или даже больше бессмысленно - весь экран будет подкачан
  867. ;dy<0: go down (удалить конечную часть tilemap): de+=dy*-TILEMAPHGT *2, hl'-=dy*-TILEMAPHGT *2
  868.         ex de,hl
  869. uvscroll_scrolltilemap_dyneg0
  870.         add hl,bc ;to
  871.         exx
  872.         add hl,bc ;size
  873.         exx
  874.         inc a
  875.         jr nz,uvscroll_scrolltilemap_dyneg0
  876.         ex de,hl
  877. uvscroll_scrolltilemap_dyq
  878.         ld a,lx
  879.         ;or a
  880.          add a,a
  881.         jr z,uvscroll_scrolltilemap_dxq
  882.         jp m,uvscroll_scrolltilemap_dxneg
  883.          cp TILEMAPWID
  884.          ret nc ;скроллить весь экран или даже больше бессмысленно - весь экран будет подкачан
  885. ;dx>0: go left (удалить начальную часть tilemap): hl+=dx, hl'-=dx
  886.         ld c,a
  887.         ;ld b,0
  888.         add hl,bc ;NC
  889.         jr uvscroll_scrolltilemap_dxok
  890. uvscroll_scrolltilemap_dxneg
  891.          cp -(TILEMAPWID+1)
  892.          ret c ;скроллить весь экран или даже больше бессмысленно - весь экран будет подкачан
  893. ;dx<0: go right (удалить конечную часть tilemap): de-=dx, hl'+=dx
  894.         neg
  895.         ex de,hl
  896.         ld c,a
  897.         ;ld b,0
  898.         add hl,bc
  899.         ex de,hl
  900. uvscroll_scrolltilemap_dxok
  901.         exx
  902.         ld c,a
  903.         ld b,0
  904.         ;or a
  905.         sbc hl,bc
  906.         exx
  907. uvscroll_scrolltilemap_dxq
  908.         exx
  909.         push hl ;size
  910.         exx
  911.         pop bc ;size
  912. ;hl=from
  913. ;de=to
  914. ;bc=size
  915.         or a
  916.         sbc hl,de
  917.         add hl,de
  918.         jr nc,uvscroll_scrolltilemap_ldir
  919.         add hl,bc
  920.         dec hl
  921.         ex de,hl
  922.         add hl,bc
  923.         dec hl
  924.         ex de,hl
  925.         lddr ;TODO ldd in a loop
  926.         ret
  927. uvscroll_scrolltilemap_ldir
  928.         ldir ;TODO ldi in a loop
  929.         ret
  930.  
  931.  
  932. countmetatilemap
  933. ;out: hl=metatilemap + (yscroll/16*METATILEMAPWID) + (x2scroll/8)
  934.         ld hl,(yscroll)
  935.         sra h
  936.         rr l
  937.         sra h
  938.         rr l
  939.         sra h
  940.         rr l
  941.         sra h
  942.         rr l ;hl=yscroll/16
  943.         if METATILEMAPWID==256
  944.         ld h,l
  945.         ld l,0
  946.         else ;METATILEMAPWID==64
  947.         add hl,hl
  948.         add hl,hl
  949.         add hl,hl
  950.         add hl,hl
  951.         add hl,hl
  952.         add hl,hl ;*64
  953.         endif
  954.         ld bc,(x2scroll)
  955.         sra b
  956.         rr c
  957.         sra b
  958.         rr c
  959.         sra b
  960.         rr c ;bc=x2scroll/8
  961.         add hl,bc
  962.          ;ld hl,0
  963.         ld bc,0xc000;+0x0800 ;metatilemap
  964.         add hl,bc
  965.         ret
  966.  
  967. uvscroll_filltilemap
  968. ;заполнение TILEMAP из карты метатайлов
  969.         call countmetatilemap ;hl=metatilemap + (yscroll/16*METATILEMAPWID) + (x2scroll/8)        
  970.         ld de,TILEMAP
  971.         ld b,TILEMAPHGT/2
  972. uvscroll_filltilemap0
  973.         push bc
  974.         push de
  975.         push hl
  976.         call uvscroll_filltilemap_line
  977.         pop hl
  978.         ld bc,METATILEMAPWID
  979.         add hl,bc
  980.         pop de
  981.         ex de,hl
  982.         ld bc,TILEMAPWID*2
  983.         add hl,bc
  984.         ex de,hl
  985.         pop bc
  986.         djnz uvscroll_filltilemap0
  987.         ret
  988.  
  989. uvscroll_filltilemap_line
  990. ;заполнение одной двойной строки TILEMAP из карты
  991. ;de=tilemap+
  992. ;hl=metatilemap+
  993. pgmetatilemap=$+1
  994.         ld a,0
  995.         SETPG32KHIGH
  996.         push de
  997.         ld bc,TILEMAPWID/2
  998. uvscroll_filltilemap_line0
  999.         ld a,(hl)
  1000.         ld (de),a
  1001.         inc de
  1002.         ldi
  1003.         jp pe,uvscroll_filltilemap_line0
  1004.         pop hl
  1005.         ld bc,TILEMAPWID
  1006.         ldir ;вторая строка тайлов такая же
  1007.         ret
  1008.  
  1009. uvscroll_filltilemap_column
  1010. ;заполнение одного двойного столбца TILEMAP из карты
  1011. ;de=tilemap+
  1012. ;hl=metatilemap+
  1013.         ld a,(pgmetatilemap)
  1014.         SETPG32KHIGH
  1015.         push de ;tilemap+
  1016.         ld de,METATILEMAPWID
  1017.         exx
  1018.         pop hl ;tilemap+
  1019.         ld de,TILEMAPWID-1
  1020.         ld b,TILEMAPHGT/2
  1021. uvscroll_filltilemap_column0
  1022.         exx
  1023.         ld a,(hl)
  1024.         add hl,de
  1025.         exx
  1026.         ld (hl),a
  1027.         inc hl
  1028.         ld (hl),a
  1029.         add hl,de
  1030.         ld (hl),a
  1031.         inc hl
  1032.         ld (hl),a ;копируем номер метатайла в 4 тайла
  1033.         add hl,de
  1034.         djnz uvscroll_filltilemap_column0
  1035.         ret
  1036.        endif
  1037.  
  1038. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1039. uvscroll_suddennextgfxpg
  1040. ;если вошли в ловушку в середине строки
  1041. ;sp=scr(line end)-... (но точно не line start)
  1042.         exx
  1043.         ;ld sp,UVSCROLL_TEMPSP ;для поля уже экрана? но SETPG и IMER займут только два слова стека - вылет на одно слово, всё равно что штатно
  1044.         inc hl
  1045.         inc hl
  1046.         inc hl
  1047.         inc hl
  1048.         ld a,(hl) ;gfx pages
  1049.         SETPG32KLOW
  1050.         exx
  1051.         ld hx,uvscroll_pushbase/256-1
  1052.         jp uvscroll_pushbase;(ix)
  1053.  
  1054. uvscroll_nextgfxpg
  1055. ;если вошли в ловушку вместо начала строки
  1056. ;sp=scr(line end)
  1057.         exx
  1058.         ;ld sp,UVSCROLL_TEMPSP ;обязательно для поля уже экрана!
  1059.         inc hl
  1060.         inc hl
  1061.         inc hl
  1062.         inc hl
  1063.         ld a,(hl) ;gfx pages
  1064.         SETPG32KLOW
  1065.         exx
  1066.         ld hx,uvscroll_pushbase/256
  1067.         jp (ix)
  1068.  
  1069. ;делаем push для одного слоя
  1070. ;в каждых 256 байтах такой код:
  1071. ;ld bc:push bc *UVSCROLL_NPUSHES ;de=0!!!
  1072. uvscroll_genpush
  1073.        push ix
  1074.         call genpush_newpage ;заказывает страницу, заносит в tpushpgs, a=pg
  1075.         SETPG32KLOW
  1076.         ld hl,uvscroll_pushbase
  1077.         ld bc,UVSCROLL_HGT
  1078. uvscroll_genpush0
  1079.         push bc
  1080.         ld a,h
  1081.         cp uvscroll_pushbase/256+64
  1082.         call z,uvscroll_genpush_nextpg
  1083.         ld b,UVSCROLL_NPUSHES
  1084. uvscroll_genpush1
  1085.         ld (hl),1 ;ld bc
  1086.         inc hl
  1087.         ;ld a,r
  1088.         ;ld (hl),a
  1089.         inc hl
  1090.         ;ld a,r
  1091.         ;ld (hl),a
  1092.         inc hl
  1093.         ld (hl),0xc5 ;push bc
  1094.         inc hl
  1095.         djnz uvscroll_genpush1
  1096.         pop bc
  1097.         dec bc
  1098.         ld a,b
  1099.         or c
  1100.         jr nz,uvscroll_genpush0
  1101.        pop ix
  1102.        inc ix
  1103.         ret
  1104. uvscroll_genpush_nextpg
  1105.         call genpush_newpage ;заказывает страницу, заносит в tpushpgs, a=pg
  1106.         push bc
  1107.         SETPGPUSHBASE
  1108.         pop bc        
  1109.         ld hl,uvscroll_pushbase
  1110.         ret
  1111.  
  1112. ;делаем вызывалки (общие для всех слоёв) - надо 3 или 4 страницы
  1113.  
  1114. ;0xc103/43/83/c3:
  1115. ;ld sp, ;надо две копии для рисования 0..39 или 1..40 столбцов (sp+1) *2 копии для +0/0x2000
  1116. ;jp (ix)
  1117. ;...
  1118. ;ld-push ;всего их UVSCROLL_NPUSHES
  1119. ;jp (hl) ;наш патч вместо ld de
  1120. ;...
  1121. ;nnnext_i
  1122.  ;push bc
  1123. ;inc hx ;адрес следующего ldpush (поэтому UVSCROLL_WID=1024)
  1124. ;inc h ;адрес следующего nnnext_i
  1125. ;56t/line * 4 layers
  1126.  
  1127. ;в последней строке страницы вызывалки (0xffxx) вместо этого:
  1128. uvscroll_nnnext_last
  1129.          push bc
  1130. uvscroll_nnnext_last_sp=$+1
  1131.         ld sp,0 ;надо две копии для рисования 0..39 или 1..40 столбцов (sp+1) *2 копии для +0/0x2000 - копии можно разместить в тех же страницах, но с другими L адресами
  1132. uvscroll_nnnext_last_pg=$+1
  1133.         ld a,0 ;следующая страница вызывалки
  1134.         SETPG32KHIGH ;сама себя заменяет!!!
  1135.         inc hx ;адрес следующего ldpush
  1136.         ld h,uvscroll_callbase/256+1 ;адрес следующего nnnext_i
  1137.         jp (ix)
  1138. uvscroll_nnnext_last_sz=$-uvscroll_nnnext_last
  1139.  
  1140. ;в последней строке экрана вместо всего этого:
  1141. ;jp uvscroll_endofscreen
  1142.  
  1143. ;после последней строки графики (0xc0xx) вместо ld-push (в любой странице вызывалки!):
  1144. ;dup UVSCROLL_NPUSHES
  1145. ;jp uvscroll_nextgfxpg
  1146. ;nop
  1147. ;edup
  1148.  
  1149. uvscroll_gencall
  1150.         ld ix,tcallpgs
  1151.         call uvscroll_gencall_newpage ;заказывает страницу, заносит в tpushpgs, a=pg
  1152.         SETPG32KHIGH
  1153.         ;ld l,0x00
  1154.         call uvscroll_gencall_startpage
  1155.         ld de,UVSCROLL_SCRSTART+(UVSCROLL_SCRWID/8)        
  1156.         ld b,UVSCROLL_SCRHGT;-1
  1157. uvscroll_gencall0
  1158.         push bc
  1159.         ld a,h
  1160.         cp uvscroll_callbase/256+0x3f
  1161.         jr nz,uvscroll_gencall_nonewpg
  1162.  
  1163.         call uvscroll_gencall_newpage ;заказывает страницу, заносит в tpushpgs, a=pg
  1164.         push af
  1165.         ld (uvscroll_nnnext_last_pg),a
  1166.        
  1167.         push de
  1168.         call uvscroll_gencall_pgend
  1169.         inc de
  1170.         ld l,0x40
  1171.         call uvscroll_gencall_pgend
  1172.         dec de
  1173.         set 5,d
  1174.         ld l,0x80
  1175.         call uvscroll_gencall_pgend
  1176.         inc de
  1177.         ld l,0xc0
  1178.         call uvscroll_gencall_pgend
  1179.         pop de
  1180.  
  1181.         pop af
  1182.         SETPG32KHIGH
  1183.         call uvscroll_gencall_startpage
  1184.         jr uvscroll_gencall_nonewpgq
  1185. uvscroll_gencall_nonewpg
  1186.         push de
  1187.         push hl
  1188.         call uvscroll_gencall_nnnext_i
  1189.         inc de
  1190.         ld l,0x40
  1191.         call uvscroll_gencall_nnnext_i
  1192.         dec de
  1193.         set 5,d
  1194.         ld l,0x80
  1195.         call uvscroll_gencall_nnnext_i
  1196.         inc de
  1197.         ld l,0xc0
  1198.         call uvscroll_gencall_nnnext_i
  1199.         pop hl
  1200.         pop de
  1201.         inc h
  1202. uvscroll_gencall_nonewpgq
  1203.         push hl
  1204.         ld hl,UVSCROLL_LINESTEP
  1205.         add hl,de
  1206.         ex de,hl
  1207.         pop hl
  1208.         pop bc        
  1209.         djnz uvscroll_gencall0
  1210.         ;ld l,0
  1211. uvscroll_gencall_end0
  1212.         ld (hl),0xc3 ;jp
  1213.         inc l
  1214.         ld (hl),uvscroll_endofscreen&0xff
  1215.         inc l
  1216.         ld (hl),uvscroll_endofscreen/256
  1217.         ld a,l
  1218.         add a,0x40-2
  1219.         ld l,a
  1220.         jr nz,uvscroll_gencall_end0
  1221.        
  1222. ;в последней странице (ix-1) не хватает блока pgend
  1223. ;скопируем его из предыдущей страницы
  1224.         ld a,(ix-2)
  1225.         SETPG32KHIGH
  1226.         ld hl,uvscroll_callbase+0x3f00
  1227.         ld de,bgpush_bmpbuf
  1228.         ld bc,256
  1229.         push bc
  1230.         push de
  1231.         push hl
  1232.         ldir
  1233.         ld a,(ix-1)
  1234.         SETPG32KHIGH
  1235.         pop de
  1236.         pop hl
  1237.         pop bc
  1238.         ldir
  1239.         ret
  1240.  
  1241. uvscroll_gencall_pgend
  1242.         push de
  1243.         push hl
  1244.         ex de,hl
  1245.         ld (uvscroll_nnnext_last_sp),hl
  1246.         ld hl,uvscroll_nnnext_last
  1247.         ld bc,uvscroll_nnnext_last_sz
  1248.         ldir
  1249.         pop hl
  1250.         pop de
  1251.         ret
  1252.  
  1253. uvscroll_gencall_startpage
  1254.         ld hl,0xc000
  1255. uvscroll_gencall_nextgfxpg0
  1256.         ld (hl),0xfd
  1257.         inc l
  1258.         ld (hl),0xe9 ;jp (iy)
  1259.         inc l
  1260.         inc l
  1261.         inc l
  1262.         jr nz,uvscroll_gencall_nextgfxpg0
  1263.         inc h
  1264.         ret
  1265.  
  1266. uvscroll_gencall_nnnext_i
  1267.          ld (hl),0xc5 ;push bc
  1268.          inc hl
  1269.         ld (hl),0xdd
  1270.         inc hl
  1271.         ld (hl),0x24 ;inc hx
  1272.         inc hl
  1273.         ld (hl),0x24 ;inc h
  1274.         inc hl
  1275.         ld (hl),0x31 ;ld sp
  1276.         inc hl
  1277.         ld (hl),e
  1278.         inc hl
  1279.         ld (hl),d
  1280.         inc hl
  1281.         ld (hl),0xdd
  1282.         inc hl
  1283.         ld (hl),0xe9 ;jp (ix)
  1284.         ret
  1285.  
  1286. uvscroll_gencall_newpage
  1287. ;заказывает страницу, заносит в tcallpgs, a=pg
  1288.         push bc
  1289.         push de
  1290.         push hl
  1291.         push ix
  1292.         OS_NEWPAGE
  1293.         pop ix
  1294.         ld a,e
  1295.         ld (ix),a
  1296.         inc ix
  1297.         pop hl
  1298.         pop de
  1299.         pop bc
  1300.         ret
  1301.  
  1302.  
  1303. uvscroll_draw
  1304.         ld hy,0xc1
  1305.         call setpgscrlow4000
  1306.         ld a,3 ;layer 0..3 [+ 4]
  1307.         call uvscroll_drawlayer
  1308.         call setpgscrhigh4000
  1309.         ld a,2 ;layer 0..3 [+ 4]
  1310.         call uvscroll_drawlayer
  1311.         call setpgscrlow4000
  1312.         ld a,1 ;layer 0..3 [+ 4]
  1313.         call uvscroll_drawlayer
  1314.         call setpgscrhigh4000
  1315.         xor a ;layer 0..3 [+ 4]
  1316. uvscroll_drawlayer
  1317.         push af
  1318.         call uvscroll_patch
  1319.         pop af
  1320.         push af
  1321.         call uvscroll_callpp
  1322.          xor a
  1323.          ld (uvscroll_scrbase+(40*UVSCROLL_SCRHGT)),a
  1324.          ld (uvscroll_scrbase+(40*UVSCROLL_SCRHGT)+0x2000),a
  1325.         pop af
  1326.         ;jp uvscroll_unpatch
  1327. uvscroll_unpatch
  1328.         ;ld d,0x01 ;d=unpatch byte ld bc
  1329.         ld d,0xc5 ;d=unpatch byte push bc
  1330.         call uvscroll_patch_d
  1331.         jp uvscroll_restorememmap
  1332.  
  1333. uvscroll_patch
  1334. ;a=layer 0..3 [+ 4]
  1335.         ld d,0xe9 ;d=patch byte jp (hl)
  1336. uvscroll_patch_d
  1337. allscroll=$+1
  1338.         ld hl,0
  1339.          add a,+(UVSCROLL_SCRNPUSHES-1)*8
  1340. allscroll_lsb=$+1
  1341.         add a,0 ;ld c,0
  1342. ;hlc = allscroll = yscroll*512+x2scroll
  1343.         ld c,a
  1344.           jr nc,$+3
  1345.           inc hl
  1346.          ld e,l ;yscroll*2
  1347.         add hl,hl
  1348.          rr e ;yscroll (corrected для зацикливания)
  1349.          rra
  1350.          or 3 ;and 0xfc
  1351.          ld l,a ;a=0xff-(((x2scroll+layer[+4])/2)&0xfc)
  1352.          ld a,h
  1353.          rla
  1354.          rla ;a=(x2scroll+layer)&3 + ((yscroll/64)*4)
  1355.          xor c
  1356.          and 0xfc
  1357.          xor c
  1358.           xor 3
  1359.         exx
  1360.         ld hl,tpushpgs
  1361.         add a,l
  1362.         ld l,a
  1363.         adc a,h
  1364.         sub l
  1365.         ld h,a
  1366.         ld a,(hl)
  1367.         SETPG32KHIGH
  1368.         exx ;hl'=список страниц графики =f((x2scroll+layer)&3 + ((yscroll/64)*4))
  1369.          ld a,e ;yscroll (corrected для зацикливания)
  1370.         or 0xc0
  1371.         ld h,a
  1372.         add a,UVSCROLL_SCRHGT
  1373.         ld e,a
  1374. ;конец (крайнее правое положение L при вызове, т.е. x2scroll=0) = 256-(UVSCROLL_SCRNPUSHES*4)
  1375. ;адрес входа графики: конец - ((x2scroll+layer[+4])/2&0xfc)
  1376. ;d=patch byte
  1377. ;e=число оставшихся строк патча
  1378. ;h=0xc0+(yscroll&63)
  1379. ;l=f(x2scroll+layer) ;L = адрес патча выхода = адрес входа графики + (UVSCROLL_SCRNPUSHES*4)-1
  1380. ;hl'=список страниц графики =f((x2scroll+layer)&3 + ((yscroll/64)*4))
  1381.         ;ld e,UVSCROLL_SCRHGT
  1382.         ;ld a,h
  1383.         sub 0xff&(0xc0+UVSCROLL_SCRHGT)
  1384.         add a,a ;a=0..64*2
  1385.         ld (uvscroll_patcher_patch0),a
  1386. uvscroll_patcher_patch0=$+1
  1387.         call uvscroll_patcher
  1388. uvscroll_patcher0
  1389.         exx
  1390.         inc hl
  1391.         inc hl
  1392.         inc hl
  1393.         inc hl
  1394.         ld a,(hl)
  1395.         SETPG32KHIGH
  1396.         exx
  1397.         ld h,0xc0
  1398.         ld a,e
  1399.         add a,h
  1400.         jr nc,uvscroll_patcher0q ;a=-64..-1 = Npatchinlastpg-0x40
  1401.         ld e,a
  1402.         call uvscroll_patcher
  1403.         jp uvscroll_patcher0
  1404. uvscroll_patcher0q
  1405.         cpl ;a=0..63 for Npatchinlastpg=64..1
  1406.         add a,a
  1407.         ld (uvscroll_patcher_patch1),a
  1408. uvscroll_patcher_patch1=$+1
  1409.         jp uvscroll_patcher
  1410.  
  1411. uvscroll_callpp
  1412. ;a=layer 0..3 [+ 4]
  1413.          push af ;a=layer 0..3 [+ 4]
  1414.  
  1415.         ld hl,allscroll_lsb
  1416.         add a,(hl)
  1417.         ld c,a
  1418.           ld hl,(allscroll)
  1419.           jr nc,$+3
  1420.           inc hl ;hlc = allscroll = yscroll*512+x2scroll
  1421.          ld e,l ;yscroll*2
  1422.         add hl,hl
  1423.          rr e ;yscroll (corrected для зацикливания)
  1424.          rra
  1425.           ld b,a
  1426.          and 0xfc
  1427.          ld lx,a ;a=0xfc-(((x2scroll+layer[+4]+((UVSCROLL_SCRNPUSHES-1)*8))/2)&0xfc)
  1428.          
  1429.         cp 0x100-(UVSCROLL_SCRNPUSHES*4-1)
  1430.         ld iy,uvscroll_nextgfxpg
  1431.         jr c,uvscroll_callpp_noxcycled
  1432.         ld iy,uvscroll_suddennextgfxpg
  1433. uvscroll_callpp_noxcycled
  1434.          
  1435.          ld a,h
  1436.          rla
  1437.          rla ;a=(x2scroll+layer)&3 + ((yscroll/64)*4)
  1438.          xor c
  1439.          and 0xfc
  1440.          xor c
  1441.           xor 3
  1442.         exx
  1443.         ld hl,tpushpgs
  1444.         add a,l
  1445.         ld l,a
  1446.         adc a,h
  1447.         sub l
  1448.         ld h,a
  1449.         ld a,(hl) ;gfx pages
  1450.         SETPG32KLOW
  1451.       ld a,(tcallpgs)
  1452.       SETPG32KHIGH
  1453.         exx
  1454.         ld a,e ;yscroll (corrected для зацикливания)
  1455.         and 63
  1456.         add a,0x80
  1457.         ld hx,a
  1458.          pop af ;a=layer 0..3 [+ 4]
  1459.          push af
  1460.           cpl
  1461.          rrca
  1462.          rrca
  1463.          and 0x80;0xc0
  1464.          ld l,a ;L=(layer&2)*0x80
  1465.          ld a,b ;a=~((x2scroll+layer+4)/2)
  1466.          and 4/2 ;если не 0, то на выходе подрисовка левого столбца
  1467.          rrca
  1468.          rrca
  1469.          rrca
  1470.          add a,l
  1471.          ld l,a ;L=(layer&2)*0x80 + ((x2scroll+layer)&4)/4*0x40
  1472. ;конец (крайнее правое положение L при вызове, т.е. x2scroll=0) = 256-(UVSCROLL_SCRNPUSHES*4)
  1473. ;адрес входа графики: конец - ((x2scroll+layer[+4])/2&0xfc)
  1474.          add a,4
  1475.          push af
  1476.          ld (uvscroll_callpp_jp),a
  1477.  
  1478.         ld de,0 ;for interrupt
  1479.         ld h,0xc2
  1480.         ld (uvscroll_endofscreen_sp),sp
  1481.         ;jp (iy);0xc104 + (N*0x40)
  1482.          ;jr $
  1483. uvscroll_callpp_jp=$+1
  1484.         jp 0xc104 ;ld sp:jp (ix)
  1485. uvscroll_endofscreen
  1486.          push bc
  1487. uvscroll_endofscreen_sp=$+1
  1488.         ld sp,0
  1489.          pop bc;ld b,ly
  1490.          pop af ;layer+4
  1491.          bit 6,b
  1492.         ret z
  1493. ;TODO подрисовка левого столбца (а если UVSCROLL_SCRWID<320, то и затирание правого)
  1494.         if 1==0
  1495.         ld hl,UVSCROLL_SCRSTART
  1496.          bit 7,b
  1497.          jr z,$+4
  1498.          set 5,h
  1499.         ld de,UVSCROLL_LINESTEP
  1500.         xor a
  1501.         dup UVSCROLL_SCRHGT-1
  1502.         ld (hl),a
  1503.         add hl,de
  1504.         edup
  1505.         ld (hl),a
  1506.         ret
  1507.        
  1508.         else
  1509. ;uvscroll_drawcolumn
  1510. ;a=layer 0..3 [+ 4]
  1511.         ;ld hl,(allscroll)
  1512.         ld hl,allscroll_lsb
  1513.         ;ld c,(hl)
  1514.          add a,+(UVSCROLL_SCRNPUSHES-0)*8
  1515.          ;sub 8
  1516. ;hlc = allscroll = yscroll*512+x2scroll
  1517.         add a,(hl);c
  1518.         ld c,a
  1519.           ld hl,(allscroll)
  1520.           jr nc,$+3
  1521.           inc hl
  1522.          ld e,l ;yscroll*2
  1523.         add hl,hl
  1524.          rr e ;yscroll (corrected для зацикливания)
  1525.          rra
  1526.          or 3 ;and 0xfc
  1527.          ;cpl
  1528.           dec a ;адрес байта графики H
  1529.          ld l,a ;a=0xff-(((x2scroll+layer[+4])/2)&0xfc)
  1530.          ld a,h
  1531.          rla
  1532.          rla ;a=(x2scroll+layer)&3 + ((yscroll/64)*4)
  1533.          xor c
  1534.          and 0xfc
  1535.          xor c
  1536.           xor 3
  1537.         exx
  1538.         ld hl,tpushpgs
  1539.         add a,l
  1540.         ld l,a
  1541.         adc a,h
  1542.         sub l
  1543.         ld h,a
  1544.         ld a,(hl)
  1545.         SETPG32KHIGH
  1546.         exx ;hl'=список страниц графики =f((x2scroll+layer)&3 + ((yscroll/64)*4))
  1547.          ld a,e ;yscroll (corrected для зацикливания)
  1548.         or 0xc0
  1549.         ld h,a
  1550. ;конец (крайнее правое положение L при вызове, т.е. x2scroll=0) = 256-(UVSCROLL_SCRNPUSHES*4)
  1551. ;адрес входа графики: конец - ((x2scroll+layer[+4])/2&0xfc)
  1552. ;d=patch byte
  1553. ;h=0x80+(yscroll&63)
  1554. ;l=f(x2scroll+layer) ;L = адрес патча выхода = адрес входа графики + (UVSCROLL_SCRNPUSHES*4)-1
  1555. ;hl'=список страниц графики =f((x2scroll+layer)&3 + ((yscroll/64)*4))
  1556.         add a,UVSCROLL_SCRHGT
  1557.         ld lx,a
  1558.          ex de,hl
  1559.          ld hl,UVSCROLL_SCRSTART
  1560.          ;ld b,ly
  1561.          bit 7,b
  1562.          jr z,$+4
  1563.          set 5,h
  1564.         ld a,d;h
  1565.         ;sub 0xc0
  1566.         add a,a ;a=0..64*2
  1567.         add a,a
  1568.         ld (uvscroll_columndrawer_patch0),a
  1569.         ld bc,UVSCROLL_LINESTEP
  1570. uvscroll_columndrawer_patch0=$+1
  1571.         call uvscroll_columndrawer
  1572.         add hl,bc
  1573. uvscroll_columndrawer0
  1574.         exx
  1575.         inc hl
  1576.         inc hl
  1577.         inc hl
  1578.         inc hl
  1579.         ld a,(hl)
  1580.         SETPG32KHIGH
  1581.         exx
  1582.         ld d,0xc0;h,0xc0
  1583.         ld a,lx
  1584.         add a,d;h
  1585.         jr nc,uvscroll_columndrawer0q ;a=-64..-1 = Nlinesinlastpg-0x40
  1586.         ld lx,a
  1587.         ;ld bc,UVSCROLL_LINESTEP
  1588.         call uvscroll_columndrawer
  1589.         add hl,bc
  1590.         jp uvscroll_columndrawer0
  1591. uvscroll_columndrawer0q
  1592.         cpl ;a=0..63 for Nlinesinlastpg=64..1
  1593.         add a,a
  1594.         add a,a
  1595.         ld (uvscroll_columndrawer_patch1),a
  1596.         ;ld bc,UVSCROLL_LINESTEP
  1597. uvscroll_columndrawer_patch1=$+1
  1598.         jp uvscroll_columndrawer
  1599.         endif
  1600.  
  1601.        if 0
  1602.         macro DRAWTILELAYERDOWN
  1603.         dup 7
  1604.         ld a,(bc)
  1605.         ld (de),a
  1606.         inc b
  1607.         inc d
  1608.         edup
  1609.         ld a,(bc)
  1610.         ld (de),a
  1611.         endm
  1612.  
  1613.         macro DRAWTILELAYERUP
  1614.         dup 7
  1615.         ld a,(bc)
  1616.         ld (de),a
  1617.         dec b
  1618.         dec d
  1619.         edup
  1620.         ld a,(bc)
  1621.         ld (de),a
  1622.         endm
  1623.  
  1624. ;8x8
  1625. ;рисуем всегда с ровного x/8 (x2/4), а Y может пересекать страницу
  1626. ;может понадобиться отрисовать 41 тайл по горизонтали
  1627. ;большая карта может состоять из нескольких зон с разной tilegfx
  1628. ;одна отрисовка должна быть в рамках одной tilegfx
  1629. ;так что выводим блоками по 8 тайлов всегда - тогда можно и X всегда привязанный к целому push (ровный x/16 (x2/8)), и весь блок из 8 тайлов не вылетит за сегмент (ровный x/64 (x2/32))
  1630. ;при экране 38x22 знакомест (надо целое число метатайлов) выводим 40 тайлов по горизонтали и 24 по вертикали (выгода 20%)
  1631. drawtiles_hor_hla_de
  1632. ;de=tilemap+
  1633. ;hla=allscroll+
  1634. ;b=число блоков по 8 тайлов
  1635.         push bc
  1636.         push de
  1637.  
  1638.          ld d,l ;y*2
  1639.         add hl,hl
  1640.          srl d ;y (corrected для зацикливания)
  1641.          rra
  1642.           and 0xf0;0xfc ;a=0xff-(((x2+layer[+4])/2)&0xfc)
  1643.           add a,2 ;адрес байта графики H
  1644.          ld e,a
  1645.          ld a,h
  1646.          add a,a
  1647.          add a,a ;a=((y/64)*4)
  1648.         ld c,a
  1649.         ld b,0
  1650.         ld ix,tpushpgs
  1651.         add ix,bc ;ix=список страниц графики =f((x2+layer)&3 + ((y/64)*4))
  1652.          set 6,d ;y+0x40 (corrected для зацикливания)
  1653. ;ix=tpushpgs+(Y/64*4)+layer
  1654.  
  1655.         pop hl ;tilemap+
  1656.         pop bc ;b=число блоков по 8 тайлов
  1657.        
  1658. ;отрисовывать тайлы справа налево (по возрастанию адресов ld-push)
  1659. drawtiles_hor_blocks0
  1660.         push bc
  1661.         push de
  1662.         call drawtiles_hor_block
  1663.         inc hl
  1664.         pop de
  1665.         ld a,e
  1666.         add a,8*2
  1667.         ld e,a
  1668.         jr nc,$+3
  1669.         inc d
  1670.         pop bc
  1671.         djnz drawtiles_hor_blocks0
  1672.         ret
  1673.        
  1674. drawtiles_hor_block
  1675. ;ix=tpushpgs+
  1676. ;hl=tilemap+
  1677. ;de=ldpush+ (4000,8000)
  1678. ;^^^делать SETPG один раз для горизонтальной линии тайлов и 1 раз за 8 тайлов для вертикальной линии тайлов (8 тайлов не может вылететь за вторую страницу, т.к. мы рисуем всегда с ровного X/8=x/64)
  1679. ;выводить линию тайлов: сначала весь первый слой, потом весь второй и т.д.
  1680.         ld a,(pgtilegfx) ;TODO по зоне
  1681.         SETPG32KHIGH
  1682.         ld a,(ix)
  1683.         SETPG16K
  1684.         ld a,(ix+4)
  1685.         SETPG32KLOW
  1686. drawtiles_hor_block_tilegfx=$+1
  1687.         ld b,TILEGFX/256 ;+0x08, если Y=y/8 нечётное
  1688.          push bc
  1689.         push de
  1690.         push hl
  1691.         call drawtiles_hor_layer
  1692.         pop hl
  1693.         pop de
  1694.         ld a,(ix+1)
  1695.         SETPG16K
  1696.         ld a,(ix+5)
  1697.         SETPG32KLOW
  1698.          pop bc
  1699.          push bc
  1700.          set 5,b
  1701.         push de
  1702.         push hl
  1703.         call drawtiles_hor_layer
  1704.         pop hl
  1705.         pop de
  1706.         ld a,(pgtilegfx2) ;TODO по зоне
  1707.         SETPG32KHIGH
  1708.         ld a,(ix+2)
  1709.         SETPG16K
  1710.         ld a,(ix+6)
  1711.         SETPG32KLOW
  1712.          pop bc
  1713.          push bc
  1714.         push de
  1715.         push hl
  1716.         call drawtiles_hor_layer
  1717.         pop hl
  1718.         pop de
  1719.         ld a,(ix+3)
  1720.         SETPG16K
  1721.         ld a,(ix+7)
  1722.         SETPG32KLOW
  1723.          pop bc
  1724.          set 5,b
  1725. drawtiles_hor_layer
  1726. ;8 tiles = 1489 (не считая call-ret)
  1727. ;*4 слоя*(6+4, считая вертикальные) блоков по 8 = 59560 > 10% от отрисовки при скролле на 8 пикс за фрейм
  1728. ;
  1729. ;c000: metatile gfx
  1730. ;iy<3f00: tilemap (содержит номера метатайлов! то есть важна чётность X тайлов, мы всегда должны рисовать с целого метатайла)
  1731. ;4000,8000: ld:push
  1732. ;чтобы выводить тайлы 8x8 прямо из графики метатайлов, надо расположить их в памяти вертикально (каждый метатайл = 128 inc h)
  1733. ;слои отстоят друг от друга на +0x2000
  1734. ;левый и правый полуметатайл отстоят друг от друга на +0x1000
  1735. ;реально в tilemap могут быть независимые номера тайлов, так что используется 4 набора тайлов - для каждой комбинации чётностей X,Y - важно для надписей
  1736. ;поэтому не пропускаем ld c
  1737.         ld c,(hl) ;tile left ;7
  1738.         DRAWTILELAYERDOWN ;+168
  1739.         inc hl
  1740.         dec e
  1741.          set 4,b
  1742.         ld c,(hl) ;tile right ;+15
  1743.         DRAWTILELAYERUP ;+168
  1744.         inc hl
  1745.         ld a,e
  1746.         add a,5
  1747.         ld e,a ;+19 = 377
  1748.          res 4,b
  1749.         ld c,(hl) ;tile left
  1750.         DRAWTILELAYERDOWN
  1751.         inc hl
  1752.         dec e
  1753.          set 4,b
  1754.         ld c,(hl) ;tile right
  1755.         DRAWTILELAYERUP
  1756.         inc hl
  1757.         ld a,e
  1758.         add a,5
  1759.         ld e,a
  1760.          res 4,b
  1761.         ld c,(hl) ;tile left
  1762.         DRAWTILELAYERDOWN
  1763.         inc hl
  1764.         dec e
  1765.          set 4,b
  1766.         ld c,(hl) ;tile right
  1767.         DRAWTILELAYERUP
  1768.         inc hl
  1769.         ld a,e
  1770.         add a,5
  1771.         ld e,a
  1772.          res 4,b
  1773.         ld c,(hl) ;tile left
  1774.         DRAWTILELAYERDOWN
  1775.         inc hl
  1776.         dec e
  1777.          set 4,b
  1778.         ld c,(hl) ;tile right
  1779.         DRAWTILELAYERUP
  1780.         ret
  1781.  
  1782. ;8x8
  1783. ;рисуем всегда с ровного x/8 (x2/4), а Y может пересекать страницу
  1784. ;при высоте 200 может понадобиться отрисовать 14 метатайлов по вертикали
  1785. ;при высоте 192-16 может понадобиться отрисовать 12 метатайлов по вертикали
  1786. drawtiles_ver_hla_de
  1787. ;de=tilemap+
  1788. ;hla=allscroll+
  1789. ;b=число блоков по 8 тайлов
  1790.         push bc
  1791.         ld hy,d
  1792.         ld ly,e ;tilemap+
  1793.        
  1794.          ld d,l ;y*2
  1795.         add hl,hl
  1796.          srl d ;y (corrected для зацикливания)
  1797.          rra
  1798.           rra
  1799.           rrca ;CY=A7=x2&4
  1800.           rlca ;A0=CY=x2&4
  1801.           rla  ;A1=A0=x2&4
  1802.           xor 2 ;3->1, 0->2
  1803.          ld e,a
  1804.          ld a,h
  1805.          add a,a
  1806.          add a,a ;a=((y/64)*4)
  1807.         ld c,a
  1808.         ld b,0
  1809.         ld ix,tpushpgs
  1810.         add ix,bc ;ix=список страниц графики =f((x2+layer)&3 + ((y/64)*4))
  1811.          set 6,d ;y+0x40 (corrected для зацикливания)
  1812. ;ix=tpushpgs+(Y/64*4)+layer
  1813.         pop bc ;b=число блоков по 8 тайлов
  1814.        
  1815. drawtiles_ver_blocks0
  1816.         push bc
  1817.         call drawtiles_ver_block
  1818.         ld bc,+(TILEMAPWID*8)-256 ;компенсация inc hy
  1819.         add iy,bc
  1820.         inc d
  1821.         jp p,drawtiles_ver_nonextpg
  1822.         ld a,d ;0x80..0xbf
  1823.         sub 64
  1824.         ld d,a
  1825.         ld bc,4
  1826.         add ix,bc
  1827. drawtiles_ver_nonextpg
  1828.         pop bc
  1829.         djnz drawtiles_ver_blocks0
  1830.         ret
  1831. drawtiles_ver_block
  1832. ;ix=tpushpgs+
  1833. ;iy=tilemap+
  1834. ;de=ldpush+ (4000,8000)
  1835. ;^^^делать SETPG один раз для горизонтальной линии тайлов и 1 раз за 8 тайлов для вертикальной линии тайлов (8 тайлов не может вылететь за вторую страницу, т.к. мы рисуем всегда с ровного X/8=x/64)
  1836. ;выводить линию тайлов: сначала весь первый слой, потом весь второй и т.д.
  1837.         ld a,(pgtilegfx) ;TODO по зоне
  1838.         SETPG32KHIGH
  1839.         ld a,(ix)
  1840.         SETPG16K
  1841.         ld a,(ix+4)
  1842.         SETPG32KLOW
  1843. drawtiles_ver_block_tilegfx=$+1
  1844.         ld h,TILEGFX/256 ;+0x10, если X=x/8 нечётное
  1845.         ld l,d
  1846.         call drawtiles_ver_layer
  1847.         dec hy
  1848.         ld a,(ix+1)
  1849.         SETPG16K
  1850.         ld a,(ix+5)
  1851.         SETPG32KLOW
  1852.          set 5,h
  1853.         ld d,l
  1854.         call drawtiles_ver_layer
  1855.         dec hy
  1856.         ld a,(pgtilegfx2) ;TODO по зоне
  1857.         SETPG32KHIGH
  1858.         ld a,(ix+2)
  1859.         SETPG16K
  1860.         ld a,(ix+6)
  1861.         SETPG32KLOW
  1862.          res 5,h
  1863.         ld d,l
  1864.         call drawtiles_ver_layer
  1865.         dec hy
  1866.         ld a,(ix+3)
  1867.         SETPG16K
  1868.         ld a,(ix+7)
  1869.         SETPG32KLOW
  1870.          set 5,h
  1871.         ld d,l
  1872. drawtiles_ver_layer
  1873. ;
  1874. ;c000: metatile gfx
  1875. ;iy<3f00: tilemap (содержит номера метатайлов! то есть важна чётность строки тайлов, мы всегда должны рисовать с целого метатайла)
  1876. ;4000,8000: ld:push
  1877. ;чтобы выводить тайлы 8x8 прямо из графики метатайлов, надо расположить их в памяти вертикально (каждый метатайл = 128 inc h)
  1878. ;слои отстоят друг от друга на +0x2000
  1879. ;реально в tilemap могут быть независимые номера тайлов, так что используется 4 набора тайлов - для каждой комбинации чётностей X,Y - важно для надписей
  1880. ;поэтому не пропускаем ld c
  1881.         ld b,h
  1882.         ld c,(iy) ;tile top
  1883.         DRAWTILELAYERDOWN ;+168
  1884.         inc d
  1885.         inc b;ld b,h
  1886.         ld c,(iy+TILEMAPWID) ;tile bottom
  1887.         DRAWTILELAYERDOWN
  1888.         inc d
  1889.         ld b,h
  1890.         ld c,(iy+(TILEMAPWID*2)) ;tile top
  1891.         DRAWTILELAYERDOWN
  1892.         inc d
  1893.         inc b;ld b,h
  1894.         ld c,(iy+(TILEMAPWID*3)) ;tile bottom
  1895.         DRAWTILELAYERDOWN
  1896.         inc hy
  1897.         inc d
  1898.         ld b,h
  1899.         ld c,(iy+(TILEMAPWID*4-256)) ;tile top
  1900.         DRAWTILELAYERDOWN
  1901.         inc d
  1902.         inc b;ld b,h
  1903.         ld c,(iy+(TILEMAPWID*5-256)) ;tile bottom
  1904.         DRAWTILELAYERDOWN
  1905.         inc d
  1906.         ld b,h
  1907.         ld c,(iy+(TILEMAPWID*6-256)) ;tile top
  1908.         DRAWTILELAYERDOWN
  1909.         inc d
  1910.         inc b;ld b,h
  1911.         ld c,(iy+(TILEMAPWID*7-256)) ;tile bottom
  1912.         DRAWTILELAYERDOWN
  1913.         ret
  1914.        endif
  1915.  
  1916.  
  1917. tcallpgs
  1918.         ds UVSCROLL_NCALLPGS
  1919.  
  1920.         display "x2scroll=",x2scroll
  1921. x2scroll
  1922.         dw 0;+(UVSCROLL_WID-UVSCROLL_SCRWID)/2
  1923. yscroll
  1924.         dw 0
  1925.  
  1926.         align 256
  1927. uvscroll_patcher
  1928.         dup 63
  1929.         ld (hl),d
  1930.         inc h
  1931.         edup
  1932.         ld (hl),d
  1933.         ret
  1934.  
  1935.         align 256
  1936. uvscroll_columndrawer
  1937.         dup 63
  1938.         ld a,(de)
  1939.         ld (hl),a
  1940.         inc d
  1941.         add hl,bc
  1942.         edup
  1943.         ld a,(de)
  1944.         ld (hl),a
  1945.         ret
  1946.  
  1947.  
  1948. pgtilegfx
  1949.         db 0 ;TODO по зонам
  1950. pgtilegfx2
  1951.         db 0 ;TODO по зонам
  1952.