
    4SSg                        d dl Z d dlZd dlZddlmZ ddlmZ  ed      5 Z ej                  e      Z
ddd       e
d   Ze
d   Zeez  ZdZd	Zd ZdZg d
Zej&                  dfdej&                  dfdej(                  dfdej(                  dfdej&                  dfdej&                  dfdej(                  dfdej(                  dfdiZ G d d      Zy# 1 sw Y   xY w)    N   )Cart)PPUzconfig.jsonscalepscale      )@)   r
   r
   )r   =      )r         )D   r      )   r   ^   )   r   (   )      r   )      r   )\   /   r   )   E   r   )   J   r   )r   G   .   )r   A   f   )r   r   r   r   r   r   r#   )r   r   r   )r   w      )!   U   r%   )   7      )   r      )r%   )   P   )r%   "   r   )   2   r   )   b   r   )5   r
   r   )r      r   )r      r'   )r         )r&   r&   r&   	   r:   r:   r9   r%   r%   r%   )      r%   )i      r%   )   r
   r%   )r%   r      )r%   a      )r%      3   )r%      r   )r*          )         )+   r	   r4   )   r	      )r      r%   )r   r   r      rQ   rQ   rP   r;   )r      r%   )      r%   )      r+   )r%         )r%   rV   rS   )r%      r   )r%      r   )r%      rF   )r=         )r         )r?      rU   )r7   r%   rR   )   ra   ra      rc   rc   rb   i    )r      rd      i (  i $  )rd   re   r   rd   i ,  c                   v    e Zd Zd ZddefdZdefdZd Zd ZddZ	d Z
defd	Zdefd
Zd Zd ZdefdZy)Framec                     t         j                  j                  t        t        z  t
        t        z  f      | _        t        j                  t        t
        f      | _        || _	        i | _
        d| _        y )Nr   )pygamedisplayset_modeWIDTHXSCALEHEIGHTwindowSurfacebufferpalettecachescanline)selfrr   s     5D:\programming\emulation\nes\nes v0.4\engine\frame.py__init__zFrame.__init__6   sN    ..))56>6F?*KLDK..%1DKDLDJDM    ppuc                    || j                   k(  ry |rd| _         | j                  |d       |dk  rA| j                  j                  d|dd|z
  f      j	                         }|j                  d       |j                  }|j                  }t        |j                  |j                         f   }|j                  |d   |d    }	|j                  |d   |d    }
t        | j                   |      }| j                  ||	||ddf| | |       |dkD  r| j                  ||
dd|dfd|z
  d|       n"|dkD  r| j                  ||
ddd|fdd|z
  |       | j                  |d       || _         |dk  r| j                  j                  d|f       y y )Nr   r   r	   r   r   r   r   r         )rt   render_spritesrq   
subsurfacecopyfillscrl_scroll_xscrl_scroll_yPS_NAMETABLEmirroring_typectrl_nametable_addrvramrangerender_name_tableblit)ru   ry   rt   cycle	new_frame	lower_scrscroll_xscroll_y	ntbl_addrp_ntbls_ntbl
scan_ranges               rv   renderzFrame.render>   s   4== dm
#q! #~++((!XsC(N)KLQQSinn\"   H  H S//1H1H1JJKIXXil9Q<0FXXil9Q<0Ft}}h/J 		63$i(	 !|
V	
Axh	 
A
V	
AsH	3>	 	QDM#~
kky1h-0 rx   c                    |j                         }|dd }t        d      D ]e  }	|	dz	  }
|
dz  |z   |vr y |	dz  }||	   }||dz  z  }| j                  |j                  ||dz    | j	                  ||||
      |dz  |
dz  ||||       g y )Ni  rd   r   r}         r   )ctrl_bknd_pattern_addrr   render_nt_tilechr_rom
bg_palette)ru   ry   	nametableviewportshift_xshift_yr   bankattribute_tableitile_rowtile_coltile_idxtile_mems                 rv   r   zFrame.render_name_tablet   s    %%'De,O6] ah!mw&*4Zh1hQ'h
Hx"}-_hAAx1}'7rx   c	                     ||d   dz
  k  s||d   k\  ry ||d   dz
  k  s||d   k\  ry | j                  ||||z   ||z   |       y )Nr      r|   r   r}   )	blit_tile)	ru   tilerr   x_posy_posr   r   r   r   s	            rv   r   zFrame.render_nt_tile   s\    x{Qx{QNN4%'/57?HMrx   c                    t        dt        |j                        d      D ]  }|j                  |dz     }|dz  dz	  |k7  r!|j                  |dz     }|j                         |dz  z   }| j	                  |j
                  ||dz    | j                  ||dz        |j                  |dz     |j                  |   ||d	z  dk7  |d
z  dk7  f        y )Nr   r   r|   rH   r   r   r   r}   @   r
   )r   lenoam_datactrl_sprt_pattern_addrr   r   sprite_palette)ru   ry   priorityr   attrr   tile_poss          rv   r~   zFrame.render_sprites   s    4S\\*D1 \\!a% d

	!X	-a!e$h ++-Q?h
nnHx"}-C
!23QUS\\!_h	
	a	
!2a!78	rx   c                 n    | j                  ||||      }|y | j                  j                  |||f       y N)cache_return_tilerq   r   )ru   r   rr   r   r   r   flips          rv   r   zFrame.blit_tile   s8    !!$4@D|KKTE5>*rx   c                 2   t        |||f      }|| j                  v r| j                  |   S |sd | j                  |<   y t        d      }t        d      D ]  }||dz      dz  }||   }	t        d      D ]c  }
|dz  |	dz  z  }|dz  }|	dz  }	|d   r|
nd|
z
  }|dz  |z  dz  }|dk(  rg d|||d	z    ?t	        | j
                  ||            d
gz   |||d	z    e  t        j                  j                  t        |      dd|d         }|| j                  |<   |S )Nr   r   r   r|   r      r}   r{   r   r%   )r   r   RGBA)
hashrs   	bytearrayr   listrr   ri   image	frombytesbytes)ru   r   rr   r   r   nameimgyupperlowerxvaluepxpis                 rv   r   zFrame.cache_return_tile   sO   7D)*DtzzZZdjj
C.C1X D1q5kQe1geQx 	D!uqy)!!q'Qq1uAvm!A:'#ba.
dll75>:;seCBrAv	DD ,,
 
 sVVT!W
ECDJJtJrx   c                     d|dz  z   }|j                   d   |j                   |   |j                   |dz      |j                   |dz      fS )Nrc   r|   r   r   rr   )ru   ry   palette_idxpalette_starts       rv   r   zFrame.sprite_palette   sT    K1,-M	kk!n	kk- 	kk-!#$	kk-!#$	 rx   c                     d||dz  dz  |dz	  z      |dz  dz  |dz  z  z	  dz  dz  z   }|j                   d   |j                   |   |j                   |dz      |j                   |dz      fS )Nr   x   r|   r}   r   r   )ru   ry   
attr_tabler   r   r   s         rv   r   zFrame.bg_palette   s    :x1}y'@XQR]&ST[cfj[jopZpu}  AE  vE  ZF  G  KO  O  TU  U  VM 
kk!n	kk- 	kk-!#$	kk-!#$	 rx   c                 R    | j                   j                  ||ft        |             y r   )ro   set_attuple)ru   r   r   rgbas       rv   	set_pixelzFrame.set_pixel   s    KK1vuT{+rx   c           
         t         dk(  r| j                  }nBt        j                  j	                  | j                  t
        t         z  t        t         z  f      }t        dk(  r|S t        t        dt        j                  t        j                  t                                D ]!  }t        j                  j                  |      }# t        j                  j	                  |t
        t        z  t        t        z  f      }|S )Nr   r   )PSCALErq   ri   	transformr   rl   rn   SCALEr   maxmathceillog2scale2xrm   )ru   surfacer   s      rv   fancyscale_bufferzFrame.fancyscale_buffer   s    {g  &&t{{UV^Vf_4UVgzn3q$))DIIe$4567 2  ((1g2 $$Wuv~v.OPGNrx   c                    d| _         | j                  j                  | j                         d       t        j
                  j                          | j                  j                  | j                  |j                  d             y )Nr   r   r   )
rt   ro   r   r   ri   rj   r   rq   r   rr   )ru   ry   s     rv   updatezFrame.update   sY    DMKKT++-v6
NNKKT\\#++a.12rx   N)i  r   F)r   )__name__
__module____qualname__rw   r   r   r   r   r~   r   r   r   r   r   r   r    rx   rv   rg   rg   4   sc    21 21l3 0N(+8 C ,
$3 3rx   rg   )ri   r   jsoncartr   ry   r   openfloadconfigr   r   rm   rl   rn   SPRITE_MODEBG_MODESYSTEM_PALETTEMIRROR_VERTICALMIRROR_HORIZONTALr   rg   r   rx   rv   <module>r      s       	- A499Q<& 	w				
(  $@ $@6"$@6"$@ $@ $@6"$@6"$@
O3 O3[ s   CC