?login_element?

Subversion Repositories NedoOS

Rev

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

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