?login_element?

Subversion Repositories NedoOS

Rev

Rev 505 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. islinevisible
  3. ;может вызываться два раза за строку cury!!! поэтому при дробном зуме элементы зума должны быть в inccury
  4. ;out: NZ=invisible
  5. ;keeps hl,de
  6.         ld a,(cury)
  7. islinevisible_patch=$+1
  8.         and 1 ;0 (x2=100%) ;3 (/2=25%)
  9.         ret
  10. inccury
  11. ;keeps hl
  12. cury=$+1 ;инициализируется в initframe
  13.         ld de,0
  14.         inc de
  15.         ld (cury),de
  16.         ret
  17.        
  18. initframes_time_scroll
  19. ;вызывается перед загрузкой картинки, ничего не знает о картинке
  20.         ld hl,0
  21.         ld (nframes),hl
  22.         ld (xscroll),hl
  23.         ld (yscroll),hl
  24.         ld hl,5
  25.         ld (gifframetime),hl
  26.         ;ret
  27. setzoom
  28. setzoom_patch=$
  29.         scf ;/or a (x1=50%)
  30.        
  31.         ld hl,readchrlomem
  32.         jr nc,$+5
  33.         ld hl,readchrlomemx2
  34.         ld (readchr_patch),hl
  35.         ld a,1
  36.         jr nc,$+4
  37.         ld a,0
  38.         ld (islinevisible_patch),a
  39.         ld a,0xc9
  40.         jr nc,$+4
  41.         ld a,0
  42.         ld (zoomhl),a
  43.         ret
  44.  
  45. initframe
  46. ;вызывать один раз на картинку после setpicwid, setpichgt и после установки gifframetime ;заказывает память под конверченный кадр
  47. ;out: ahl=адрес памяти под конверченный кадр
  48. initframe_ditherphase=$+1
  49.         ld hl,dithermcy0-2
  50.         ld (drawscreenline_frombuf_ixaddr),hl
  51.         ex de,hl
  52.         ld hl,0xffff&(dithermcy0-2+dithermcy1-2)
  53.         or a
  54.         sbc hl,de
  55.         ld (initframe_ditherphase),hl
  56. initframe_colorphase=$+1
  57.         ld hl,colorlace0-2
  58.         ld (drawscreenline_frombuf_iyaddr),hl
  59.         ex de,hl
  60.         ld hl,0xffff&(colorlace0-2+colorlace1-2)
  61.         or a
  62.         sbc hl,de
  63.         ld (initframe_colorphase),hl
  64.         ld hl,0x4000;0xc000
  65.         ld (drawscreenline_frombuf_scr),hl
  66.         ld hl,0
  67.         ld (cury),hl
  68.  
  69.         call initprlinefast ;один раз в начале картинки (потом можно инитить при скролле один раз за всю перерисовку)
  70.         jp reservemem_convertedframe ;заказывает память под конверченный кадр
  71.  
  72. reservefirstframeaddr
  73.         ld hl,(freemem_hl)
  74.         ld (firstframeaddr),hl
  75.         ld a,(freemem_a)
  76.         ld (firstframeaddrHSB),a
  77.         ret
  78.  
  79. setpichgt
  80.         LD (curpichgt),HL
  81.          call zoomhl
  82.         inc hl
  83.         srl h
  84.         rr l
  85.         ld (curpichgt_visible),hl
  86.         ret
  87.  
  88. setpicwid
  89.         LD (curpicwid),HL
  90.          ld d,h
  91.          ld e,l
  92.          add hl,hl
  93.          add hl,de
  94.          ld (curpicwidx3),hl
  95.         ex de,hl
  96.          call zoomhl
  97.         ld b,3
  98.          inc hl
  99.          srl h
  100.          rr l
  101.         djnz $-2-2-1
  102.         ld (keepframe_linesize),hl
  103.         ld a,l
  104.         add hl,hl
  105.         ld (keepframe_linesize_bytes),hl
  106.         ret
  107.  
  108. zoomhl
  109.         ret ;/nop
  110.         add hl,hl
  111.         ret
  112.        
  113. reservemem_convertedframe
  114. ;reserve converted frame with timings:
  115. ;+0 (3) pnext
  116. ;+3 (2) time
  117. ;+5 converted frame
  118. ;size = 5 + ((pichgt+1) div 2)*((picwid+7) div 8)*2
  119.         ld hl,(freemem_hl)
  120.         ld a,(freemem_a)
  121.          push af
  122.          push hl
  123.         ld de,(keepframe_linesize_bytes)
  124.         ld bc,(curpichgt_visible)
  125.          ;inc bc
  126.          ;inc bc
  127.         call MULWORD ;hlbc=de*bc
  128.         ld d,b
  129.         ld e,c
  130.         ld bc,5 ;header
  131.         ex de,hl
  132.         add hl,bc
  133.         ex de,hl
  134.         jr nc,$+3
  135.         inc hl
  136. ;hlde=size
  137.         call reserve_mem
  138.         ld b,h
  139.         ld c,l ;ld (keepframeaddr),hl
  140.         ld e,a;ld (keepframeaddrHSB),a
  141.          pop hl
  142.          pop af
  143. ;ahl=начало кадра
  144.         call writeword ;pnext
  145.         ld c,e
  146.         call writebyte ;pnextHSB
  147. gifframetime=$+1
  148.         ld bc,0 ;time
  149.         call writeword
  150.         ld (keepframeaddr),hl
  151.         ld (keepframeaddrHSB),a        
  152.         ret
  153.  
  154. keepconvertedline
  155. ;запоминаем сконверченную строку из LINEPIXELS
  156.         ld bc,(keepframe_linesize_bytes) ;size (pixels+attr)
  157.         push bc
  158.         ld de,LINEPIXELS;KEEPFRAMELINE
  159. keepframeaddr=$+1
  160.         ld hl,0
  161. keepframeaddrHSB=$+1
  162.         ld a,0
  163.         call puttomem ;запоминаем сконверченную строку
  164.         pop bc ;size
  165.         ld hl,(keepframeaddr)
  166.         ld a,(keepframeaddrHSB)
  167.         add hl,bc
  168.         adc a,0
  169.         ld (keepframeaddr),hl
  170.         ld (keepframeaddrHSB),a
  171.         ret
  172.  
  173.  
  174. showframe
  175. ;ahl=addr
  176.         push af
  177.         push hl
  178.         call initprlinefast
  179.         pop hl
  180.         pop af
  181.  
  182.         call readword ;de
  183.         push de ;ld (showframe_nextaddr),de
  184.         call readbyte ;c
  185.         ld b,c
  186.         push bc ;ld (showframe_nextaddrHSB),bc
  187.         call readword
  188.         ld (showframetime),de
  189.        
  190. ;skip invisible lines (yscroll):
  191. yscroll=$+1
  192.         ld bc,0
  193.         ld de,(keepframe_linesize_bytes)
  194.         inc bc
  195.         jr showframe_skipyscrollgo
  196. showframe_skipyscroll0
  197.         add hl,de
  198.         adc a,0
  199. showframe_skipyscrollgo
  200.         dec hl
  201.         cpi
  202.         jp pe,showframe_skipyscroll0
  203. xscroll=$+1
  204.         ld bc,0
  205.         add hl,bc
  206.         adc a,0
  207.         ld (keepframeaddr),hl
  208.         ld (keepframeaddrHSB),a        
  209.  
  210.         ;call setpgtemp4000
  211.  
  212.         ld hl,(curpichgt_visible)
  213.         ld bc,(yscroll)
  214.         or a
  215.         sbc hl,bc
  216.         jr z,showframelinesq
  217.         jr c,showframelinesq
  218.  
  219.         ld bc,SCROLLHGT;200 ;TODO в зависимости от scry
  220.         call minhl_bc_tobc        
  221.         ld hy,c
  222.          ;ld hy,100
  223.         ld de,0x4000 ;TODO в зависимости от scry
  224. ;рисовать прямо из памяти (окна 2,3), а пиксели/атрибуты переключать в 0x4000:
  225. showframelines0
  226. ;de=screen
  227.          ;push de
  228.         ld hl,(keepframeaddr)
  229.         ld a,(keepframeaddrHSB)
  230.         rl h
  231.         rla
  232.         rl h
  233.         rla
  234.         srl h
  235.         scf
  236.         rr h
  237.         ld c,a
  238.         ld b,textpages/256
  239.         ld a,(bc)
  240.          ex af,af'
  241.        inc c
  242.        ld a,(bc)
  243.        SETPG32KHIGH
  244.         ex af,af'
  245.         SETPG32KLOW
  246.          ;pop bc
  247.          ld b,d
  248.          ld c,e
  249. ;hl=data
  250. ;bc=screen=0x4000+
  251.         call prlinefast ;keeps bc (except bit 5,b), bit 5,b doesn't matter
  252.         ld hl,(keepframeaddr)
  253.         ld a,(keepframeaddrHSB)
  254. keepframe_linesize_bytes=$+1
  255.         ld de,0
  256.         add hl,de
  257.         ld (keepframeaddr),hl
  258.         ld hl,40
  259.         adc a,h;0
  260.         ld (keepframeaddrHSB),a
  261.         add hl,bc
  262.          ex de,hl ;next screen line, bit 5,b doesn't matter
  263.         dec hy
  264.         jp nz,showframelines0
  265.  
  266. showframelinesq
  267.         pop af
  268.         pop hl ;next
  269.         ret
  270.  
  271. initprlinefast
  272. stopprlinefast_data=$+1
  273.         ld hl,0
  274. stopprlinefast_patch=$+1
  275.         ld (stopprlinefast_data),hl ;снимаем старый патч
  276.  
  277.         ld hl,(keepframe_linesize) ;TODO endx (картинка может быть больше экрана)
  278.         ld bc,80
  279.         call minhl_bc_tobc
  280.        
  281.         ld de,0 ;TODO x (картинка может быть не прижата к левому краю)
  282.  
  283. ;e=visible x in chr
  284. ;c=visible endx in chr
  285. ;(keepframe_linesize)=picwid in chr
  286.         ld a,e ;x
  287.         rra
  288.         sbc a,a
  289.         and 0x2b ;"dec hl"
  290.         ld (prlinefast_datadec),a
  291.        
  292.         ld a,e ;x
  293.         inc a
  294.         rra
  295.         rra ;CY for x=1,2, 5,6, ...
  296.         sbc a,a
  297.         and 0xe8-0xa8
  298.         add a,0xa8;set 5,b(0xe8) for x=1,2, 5,6, ..., or else res 5,b(0xa8)
  299.         ld (prlinefast_scrset5),a
  300.        
  301. ;entry = prlinefast_go + 0, 3, 6, 9...:
  302.         ;de=x
  303.         ld hl,prlinefast_go
  304.         add hl,de
  305.         add hl,de
  306.         add hl,de        
  307.         ld (prlinefast_jp),hl
  308.         ld (prlinefast_jp2),hl
  309.        
  310. ;какое в конце получается смещение sp относительно начального data
  311.         ;прибавим 2*сколько раз сделали pop (включая pseudo-pop в начале)
  312.         ;((endx-1)/2 - x/2)+1 = ((endx+1)/2 - x/2) раз сделали pop
  313.         ld a,c ;endx
  314.         inc a
  315.          srl a
  316.          srl e ;x
  317.          sub e ;((endx+1)/2 - x/2)
  318.          add a,a ;NC ;TODO протестировать or 0x01:sub e:and 0xfe
  319.         ld e,a
  320.         ;ld d,0 ;de=смещение sp относительно начального data
  321. ;какое нам надо получить начальное смещение data для paper:
  322. keepframe_linesize=$+1
  323.         ld hl,0;(keepframe_linesize)
  324.         ;or a
  325.         sbc hl,de
  326.         ld (prlinefast_sizeadd),hl ;картинка может быть больше экрана, нельзя просто обойтись чётной шириной и не переставлять sp
  327.  
  328. ;exitpatch = prlinefast_go + endx*3 - 2
  329. ;но при x mod 4 = 3 надо на 1 байт раньше
  330.         ;bc=endx
  331.         ld hl,prlinefast_go-2
  332.         add hl,bc
  333.         add hl,bc
  334.         add hl,bc
  335.        
  336.         ld a,c ;endx
  337.         cpl
  338.         and 3
  339.  
  340.         jr nz,$+3
  341.         dec hl      
  342.         ld (stopprlinefast_patch),hl
  343.         ld e,(hl)
  344.         ld (hl),0xdd
  345.         inc hl
  346.         ld d,(hl)
  347.         ld (hl),0xe9 ;"jp (ix)"
  348.         ld (stopprlinefast_data),de
  349.        
  350.         ld hl,prlinefastq
  351.         jr nz,$+5
  352.         ld hl,prlinefastqres5h
  353.         ld (prlinefast_ix),hl
  354.         ld de,prlinefastq2-prlinefastq
  355.         add hl,de
  356.         ld (prlinefast_ix2),hl
  357.  
  358.         ret
  359.        
  360. ;interrupt handler keeps de in (sp) to restore data
  361. prlinefast
  362. ;hl=data
  363. ;bc=screen (kept except bit 5,b)
  364.         ld (prlinefastsp),sp ;TODO один раз
  365. prlinefast_datadec=$
  366.         nop ;/dec hl for odd x
  367.         ld e,(hl)
  368.         inc hl
  369.         ld d,(hl) ;берём вручную, чтобы стек не запорол область перед данными
  370.         inc hl
  371.          exx
  372. ;setpgs_scr_pixels=$+1
  373. ;         ld a,0
  374.         ld a,(user_scr0_high) ;ok
  375.          SETPG16K
  376.          exx
  377.         ld sp,hl
  378. prlinefast_scrset5=$+1
  379.         res 5,b ;/set 5,b for x=1,2, 5,6, ...
  380.         ld h,b
  381.         ld l,c
  382. prlinefast_ix=$+2
  383.         ld ix,prlinefastq
  384. prlinefast_jp=$+1
  385.         jp prlinefast_go+1 ;может быть другая точка ;draw pixels
  386. prlinefastqres5h ;endx mod 4 = 3
  387.         res 5,h
  388.         ld (hl),e
  389. prlinefastq ;endx mod 4 = 0, 1, 2
  390. ;нельзя выходить сразу после pop de:ld (hl),d, надо после pop de
  391. prlinefast_sizeadd=$+1
  392.         ld hl,0
  393.         add hl,sp ;attr data
  394.         ld sp,SPOIL4B ;можно портить (дальше de станет неактуальным и не сможет исправлять стек)
  395.          exx
  396. ;setpgs_scr_attr=$+1
  397. ;         ld a,0
  398.         ld a,(user_scr0_low) ;ok
  399.          SETPG16K
  400.          exx
  401.         ld e,(hl)
  402.         inc hl
  403.         ld d,(hl) ;берём вручную, чтобы стек не запорол область перед данными
  404.         inc hl
  405.         ld sp,hl
  406.         ld h,b
  407.         ld l,c        
  408. prlinefast_ix2=$+2
  409.         ld ix,prlinefastq2
  410. prlinefast_jp2=$+1
  411.         jp prlinefast_go ;может быть другая точка ;draw attr
  412. prlinefastq2res5h ;endx mod 4 = 3
  413.         res 5,h
  414.         ld (hl),e
  415. prlinefastq2 ;endx mod 4 = 0, 1, 2
  416. ;нельзя выходить сразу после pop de:ld (hl),d, надо после pop de
  417. prlinefastsp=$+1
  418.         ld sp,0
  419.         ret
  420. prlinefast_go
  421.         dup 80/4-1
  422.         ld (hl),e
  423.         set 5,h
  424.         ld (hl),d
  425.         inc hl
  426.         pop de
  427.         ld (hl),d
  428.         res 5,h
  429.         ld (hl),e
  430.         inc hl
  431.         pop de
  432.         edup
  433.         ld (hl),e
  434.         set 5,h
  435.         ld (hl),d
  436.         inc hl
  437.         pop de
  438.         ld (hl),d
  439.         res 5,h
  440.         ld (hl),e
  441.         jp (ix)
  442.  
  443.  
  444.  
  445.