
    Sg!                     >    d dl  d dlmZ dZdZg dZ G d d      Zy)	   )*)Carti       ))    r   r   r   )r   r   r   r   )r   r         c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdefdZ d Z!d  Z"d! Z#y")#PPUc                 x   || _         t        d      | _        t        j                  | _        t        | j
                     | _        ddg| _        d| _	        d| _
        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        t        d      | _        d| _         t        d      | _!        t        d      | _"        d| _#        d| _$        d| _%        d| _&        y )N   r   r   F       )'frame	bytearraychr_romr   MIRROR_HORIZONTALmirroring_typeMIRROR_TYPES	mirroring
addr_valueaddr_hi_ptrctrl_flag_Vctrl_flag_Pctrl_flag_Hctrl_flag_Bctrl_flag_Sctrl_flag_Ictrl_flag_Nmask_flag_Bmask_flag_Gmask_flag_Rmask_flag_smask_flag_bmask_flag_Mmask_flag_mmask_flag_gscrl_scroll_xscrl_scroll_y
scrl_latchstat_flag_Vstat_flag_Sstat_flag_Ovramoam_addroam_datapalettebufferscanlinecyclesnmi_interrupt)selfr   s     "d:\Programming\nes 3\engine\ppu.py__init__zPPU.__init__   s3   DJT?DL00D!$"5"56DN!fDODDDDDDDDDDDDDDDDDDDODDD$DIDMcNDMR=DLDKDMDKD    c                 "    |dz	  |dz  g| _         y )N      r   r5   datas     r6   addr_setzPPU.addr_setD   s    qy$+.DOr8   c                     | j                    | _         || j                  | j                   <   | j                  dxx   dz  cc<   y )Nr   ?   )r   r   r=   s     r6   addr_updatezPPU.addr_updateG   s;    +++D(,DOOD$$%OOA*$r8   c                     | j                   dxx   |z  cc<   | j                   d   dkD  r:| j                   dxx   dz  cc<   | j                   d   dz   dz  | j                   d<   y y )Nr   r;   r   rA   r<   )r5   incs     r6   addr_inczPPU.addr_incL   sa    OOA#qD 
ooaD  OOA.2j@dooa !r8   c                 "    | j                   rdS dS )Ni $  r   )r   r5   s    r6   ctrl_nametable_addrzPPU.ctrl_nametable_addr[   s    %%6161r8   c                 "    | j                   rdS dS )Nr   r   )r   rG   s    r6   ctrl_vram_addr_inczPPU.ctrl_vram_addr_inc^       !!2(q(r8   c                 "    | j                   rdS dS Ni   r   )r   rG   s    r6   ctrl_sprt_pattern_addrzPPU.ctrl_sprt_pattern_addra       ##4**r8   c                 "    | j                   rdS dS rM   )r   rG   s    r6   ctrl_bknd_pattern_addrzPPU.ctrl_bknd_pattern_addrd   rO   r8   c                 "    | j                   rdS dS )N   r:   )r   rG   s    r6   ctrl_sprt_sizezPPU.ctrl_sprt_sizeg   rK   r8   c                     |dz  dk7  | _         |dz  dk7  | _        |dz  dk7  | _        |dz  dk7  | _        |dz  dk7  | _        |dz  dk7  | _        |dz  | _        y )	N   r   @   r   rS   r:      r   r   r   r   r   r   r   r   r=   s     r6   ctrl_setzPPU.ctrl_setp   s{    j(A-Dj(A-Dj(A-Dj(A-Dj(A-Dj(A-Dj(Dr8   c                     | j                   dz  | j                  dz  z  | j                  dz  z  | j                  dz  z  | j                  dz  z  | j
                  dz  z  | j                  z  S )N         rX   r   r   rY   rG   s    r6   ctrl_getzPPU.ctrl_gety   s    
!
!
! ! !	
 ! r8   c                 H    | j                   | j                  | j                  gS N)r!   r    r   rG   s    r6   mask_emphasizezPPU.mask_emphasize   s'    


 r8   c                     |dz  dk7  | _         |dz  dk7  | _        |dz  dk7  | _        |dz  dk7  | _        |dz  dk7  | _        |dz  dk7  | _        |dz  dk7  | _        |d	z  dk7  | _        y )
NrV   r   rW   r   rS   r:   rX   r   r   r   r    r!   r"   r#   r$   r%   r&   r5   values     r6   mask_setzPPU.mask_set   s    z)Q.Dz)Q.Dz)Q.Dz)Q.Dz)Q.Dz)Q.Dz)Q.Dz)Q.Dr8   c                     | j                   dz  | j                  dz  z  | j                  dz  z  | j                  dz  z  | j                  dz  z  | j
                  dz  z  | j                  dz  z  | j                  dz  z  S )	Nr\   r]   r^   rX   r   r   r   r   rd   rG   s    r6   mask_getzPPU.mask_get   s    111 1 1	
 1 1 1	r8   c                 ^    | j                   r|| _        n|| _        | j                    | _         y ra   )r)   r(   r'   r=   s     r6   
scrl_writezPPU.scrl_write   s'    dd//)DOr8   c                 :    | j                   | j                  dz  z  S )Nr^   r'   r(   rG   s    r6   scrl_getzPPU.scrl_get   s     2 2a 777r8   c                 ,    |dz  | _         |dz	  | _        y )N   r^   rm   r=   s     r6   scrl_setzPPU.scrl_set   s    DDr8   c                     || _         y ra   )r,   )r5   statuss     r6   stat_set_sprite_overflowzPPU.stat_set_sprite_overflow   s
    Dr8   c                 `    | j                   dz  | j                  dz  z  | j                  dz  z  S )Nr\   r]   r^   r*   r+   r,   rG   s    r6   stat_getzPPU.stat_get   s;    
!
!
!r8   c                 R    |dz  dk7  | _         |dz  dk7  | _        |dz  dk7  | _        y )NrV   r   rW   r   rv   re   s     r6   stat_setzPPU.stat_set   s8    z)Q.Dz)Q.Dz)Q.Dr8   c                    | xj                   |z  c_         | j                   dk  ry| j                  r?| j                  d   | j                  k(  r#| j                  d   | j                   k  rd| _        | xj                   dz  c_         | xj                  dz  c_        | j                  dk(  r"d| _        d| _        | j                  rd| _        y| j                  dk\  rd| _        d| _        d| _        d| _        yy)	NiU  Fr   r   r      Ti  )r3   r"   r/   r2   r+   r*   r   r4   )r5   r3   s     r6   tickzPPU.tick   s    KK6K {{SDMM!,=$--PQBRVZVaVaBadKK3KMMQM}}dd			!  
#	dm dddr8   c                     | j                   }| j                  |       |s"| j                   r| j                  rd| _        y y y y )NT)r   rZ   r*   r4   )r5   r>   prev_nmis      r6   
write_ctrlzPPU.write_ctrl   s?    HMM$$**t/?/?d 0@*Hr8   c                 P    | j                         }d| _        d| _        d| _        |S )Nr   r   F)rw   r*   r   r)   r=   s     r6   read_statuszPPU.read_status   s)    ==?DDDDOKr8   c                 d    || j                   | j                  <   | j                  dz   dz  | _        y )Nr   r;   )r/   r.   r=   s     r6   write_oam_datazPPU.write_oam_data  s)    #'DMM$-- ]]Q&$.DMr8   c                 v   | j                   d   dz  | j                   d   z  }d|cxk  rdk  r3n n0|| j                  | j                  |t        z
  dz	     dz  |dz  z   <   n:|dv r|| j                  |d	z  d
z  <   n d|cxk  rdk  rn n|| j                  |d
z  <   | j                  | j                                y )Nr   r:   r   r    0  
     )i?  i?  i?  i?  rS   rp    ?   @  )r   r-   r   NAMETABLE_ADDRr0   rE   rJ   )r5   r>   addrs      r6   
write_datazPPU.write_data  s    ??1"T__Q%77DX\dii~ 5 ;<Bte|TU	1	1+/dllD4K4'(	4	 &	 "&dll4$; 	MM$))+,r8   c                    | j                   d   dz  | j                   d   z  }| j                  | j                                d|cxk  rdk  r!n n| j                  | j                  |         S d|cxk  rdk  rAn n>| j                  | j
                  | j                  |t        z
  dz	     dz  |dz  z            S d|cxk  rd	k  rn y | j                  |d
z     S y )Nr   r:   r   r   r   r   r   r   r   rp   )	r   rE   rJ   
use_bufferr   r-   r   r   r0   )r5   r   s     r6   	read_datazPPU.read_data  s    ??1"T__Q%77DMM$))+,__T\\$/00	4	 &	 __TYYtn7LPR7R(SWY(Y^bej^j'klmm	4	 &	 \\$+&& 
!r8   c                 L    || j                   d  |d | j                    z   | _        y ra   )r.   r/   r=   s     r6   write_oam_dmazPPU.write_oam_dma1  s*    
4==>
>DMM 	Mr8   c                 .    | j                   |c}| _         |S ra   )r1   )r5   exprouts      r6   r   zPPU.use_buffer7  s    {{DCJr8   cartc                 x    |j                   | _         |j                  | _        t        | j                     | _        y ra   )r   screen_mirroringr   r   r   )r5   r   s     r6   attach_cartzPPU.attach_cart;  s-    <<DL//D!$"5"56DNr8   c                 ~    t        d      | _        t        j                  | _        t
        | j                     | _        y )Nr   )r   r   r   r   r   r   r   rG   s    r6   detach_cartzPPU.detach_cart@  s-    T?DL00D!$"5"56DNr8   c                 .    d| _         d| _        d| _        y )Nr   F)r2   r3   r4   rG   s    r6   resetz	PPU.resetE  s    DMDKDr8   c                 ,    | j                   rd| _         yy)NFT)r4   rG   s    r6   poll_nmizPPU.poll_nmiJ  s     dr8   N)$__name__
__module____qualname__r7   r?   rB   rE   rH   rJ   rN   rQ   rT   rZ   r_   rb   rg   ri   rk   rn   rq   rt   rw   ry   r|   r   r   r   r   r   r   r   r   r   r   r   r    r8   r6   r
   r
      s    .f/%
A2)++))	:/
*8#/6 /-.'&7d 7
7

r8   r
   N)ppu_registersr   r   NAMETABLE_LENr   r   r
   r   r8   r6   <module>r      s*      @ @r8   