Subversion Repositories NedoOS

Rev

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

  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.          SETPG16K
  375.          exx
  376.         ld sp,hl
  377. prlinefast_scrset5=$+1
  378.         res 5,b ;/set 5,b for x=1,2, 5,6, ...
  379.         ld h,b
  380.         ld l,c
  381. prlinefast_ix=$+2
  382.         ld ix,prlinefastq
  383. prlinefast_jp=$+1
  384.         jp prlinefast_go+1 ;ьюцхЄ с√Є№ фЁєур  Єюўър ;draw pixels
  385. prlinefastqres5h ;endx mod 4 = 3
  386.         res 5,h
  387.         ld (hl),e
  388. prlinefastq ;endx mod 4 = 0, 1, 2
  389. ;эхы№ч  т√їюфшЄ№ ёЁрчє яюёых pop de:ld (hl),d, эрфю яюёых pop de
  390. prlinefast_sizeadd=$+1
  391.         ld hl,0
  392.         add hl,sp ;attr data
  393.         ld sp,SPOIL4B ;ьюцэю яюЁЄшЄ№ (фры№°х de ёЄрэхЄ эхръЄєры№э√ь ш эх ёьюцхЄ шёяЁрты Є№ ёЄхъ)
  394.          exx
  395. setpgs_scr_attr=$+1
  396.          ld a,0
  397.          SETPG16K
  398.          exx
  399.         ld e,(hl)
  400.         inc hl
  401.         ld d,(hl) ;схЁ╕ь тЁєўэє■, ўЄюс√ ёЄхъ эх чряюЁюы юсырёЄ№ яхЁхф фрээ√ьш
  402.         inc hl
  403.         ld sp,hl
  404.         ld h,b
  405.         ld l,c        
  406. prlinefast_ix2=$+2
  407.         ld ix,prlinefastq2
  408. prlinefast_jp2=$+1
  409.         jp prlinefast_go ;ьюцхЄ с√Є№ фЁєур  Єюўър ;draw attr
  410. prlinefastq2res5h ;endx mod 4 = 3
  411.         res 5,h
  412.         ld (hl),e
  413. prlinefastq2 ;endx mod 4 = 0, 1, 2
  414. ;эхы№ч  т√їюфшЄ№ ёЁрчє яюёых pop de:ld (hl),d, эрфю яюёых pop de
  415. prlinefastsp=$+1
  416.         ld sp,0
  417.         ret
  418. prlinefast_go
  419.         dup 80/4-1
  420.         ld (hl),e
  421.         set 5,h
  422.         ld (hl),d
  423.         inc hl
  424.         pop de
  425.         ld (hl),d
  426.         res 5,h
  427.         ld (hl),e
  428.         inc hl
  429.         pop de
  430.         edup
  431.         ld (hl),e
  432.         set 5,h
  433.         ld (hl),d
  434.         inc hl
  435.         pop de
  436.         ld (hl),d
  437.         res 5,h
  438.         ld (hl),e
  439.         jp (ix)
  440.  
  441.  
  442.  
  443.