?login_element?

Subversion Repositories NedoOS

Rev

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