Subversion Repositories NedoOS

Rev

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

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