?login_element?

Subversion Repositories NedoOS

Rev

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

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