
    ZSh!                     >    S SK 7  S SKJr  SrSr/ SQr " S S5      rg)	   )*)Carti       ))    r   r   r   )r   r   r   r   )r   r         c                       \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS\ 4S jr!S  r"S! r#S" r$S#r%g$)%PPU   c                 v   Xl         [        S5      U l        [        R                  U l        [        U R
                     U l        SS/U l        SU l	        SU l
        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        [        S5      U l        SU l         [        S5      U l!        [        S5      U l"        SU l#        SU l$        SU l%        SU l&        g )Ni   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     9C:\Users\trevor\Downloads\nes_v0.5\nes_v0.5\engine\ppu.py__init__PPU.__init__   s1   J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                 "    US-	  US-  /U l         g )N      r   r5   datas     r6   addr_setPPU.addr_setD   s    qy$+.DOr9   c                     U R                   (       + U l         XR                  U R                   '   U R                  S==   S-  ss'   g )Nr   ?   )r   r   r>   s     r6   addr_updatePPU.addr_updateG   s9    +++D(,OOD$$%OOA*$r9   c                     U R                   S==   U-  ss'   U R                   S   S:  a:  U R                   S==   S-  ss'   U R                   S   S-   S-  U R                   S'   g g )Nr   r<   r   rC   r=   )r5   incs     r6   addr_incPPU.addr_incL   sa    OOA#qD 
ooaD  OOA.2j@dooa !r9   c                 ,    U R                   (       a  S$ S$ )Ni $  r   )r   r5   s    r6   ctrl_nametable_addrPPU.ctrl_nametable_addr[   s    %%6161r9   c                 ,    U R                   (       a  S$ S$ )Nr   r   )r   rK   s    r6   ctrl_vram_addr_incPPU.ctrl_vram_addr_inc^       !!2(q(r9   c                 ,    U R                   (       a  S$ S$ Ni   r   )r   rK   s    r6   ctrl_sprt_pattern_addrPPU.ctrl_sprt_pattern_addra       ##4**r9   c                 ,    U R                   (       a  S$ S$ rS   )r   rK   s    r6   ctrl_bknd_pattern_addrPPU.ctrl_bknd_pattern_addrd   rV   r9   c                 ,    U R                   (       a  S$ S$ )N   r;   )r   rK   s    r6   ctrl_sprt_sizePPU.ctrl_sprt_sizeg   rQ   r9   c                     US-  S:g  U l         US-  S:g  U l        US-  S:g  U l        US-  S:g  U l        US-  S:g  U l        US-  S:g  U l        US-  U l        g )	N   r   @   r   r[   r;      r   r   r   r   r   r   r   r   r>   s     r6   ctrl_setPPU.ctrl_setp   s{    j(A-Dj(A-Dj(A-Dj(A-Dj(A-Dj(A-Dj(Dr9   c                     U R                   S-  U R                  S-  -  U R                  S-  -  U R                  S-  -  U R                  S-  -  U R
                  S-  -  U R                  -  $ )N         ra   r   r   rb   rK   s    r6   ctrl_getPPU.ctrl_gety   s    
!
!
! ! !	
 ! r9   c                 H    U R                   U R                  U R                  /$ N)r!   r    r   rK   s    r6   mask_emphasizePPU.mask_emphasize   s'    


 r9   c                     US-  S:g  U l         US-  S:g  U l        US-  S:g  U l        US-  S:g  U l        US-  S:g  U l        US-  S:g  U l        US-  S:g  U l        US	-  S:g  U l        g )
Nr_   r   r`   r   r[   r;   ra   r   r   r   r    r!   r"   r#   r$   r%   r&   r5   values     r6   mask_set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r9   c                     U R                   S-  U R                  S-  -  U R                  S-  -  U R                  S-  -  U R                  S-  -  U R
                  S-  -  U R                  S-  -  U R                  S-  -  $ )	Nrf   rg   rh   ra   r   r   r   r   rp   rK   s    r6   mask_getPPU.mask_get   s    111 1 1	
 1 1 1	r9   c                 l    U R                   (       a  Xl        OXl        U R                   (       + U l         g rl   )r)   r(   r'   r>   s     r6   
scrl_writePPU.scrl_write   s#    //)DOr9   c                 :    U R                   U R                  S-  -  $ )Nrh   r'   r(   rK   s    r6   scrl_getPPU.scrl_get   s     2 2a 777r9   c                 ,    US-  U l         US-	  U l        g )N   rh   r|   r>   s     r6   scrl_setPPU.scrl_set   s    DDr9   c                     Xl         g rl   )r,   )r5   statuss     r6   stat_set_sprite_overflowPPU.stat_set_sprite_overflow   s    r9   c                 `    U R                   S-  U R                  S-  -  U R                  S-  -  $ )Nrf   rg   rh   r*   r+   r,   rK   s    r6   stat_getPPU.stat_get   s;    
!
!
!r9   c                 R    US-  S:g  U l         US-  S:g  U l        US-  S:g  U l        g )Nr_   r   r`   r   r   rq   s     r6   stat_setPPU.stat_set   s8    z)Q.Dz)Q.Dz)Q.Dr9   c                    U =R                   U-  sl         U R                   S:  a  gU R                  (       aA  U R                  S   U R                  :X  a$  U R                  S   U R                   ::  a  SU l        U =R                   S-  sl         U =R                  S-  sl        U R                  S:X  a(  SU l        SU l        U R                  (       d   SU l        gU R                  S:  a  SU l        SU l        SU l        SU l        gg)	NiU  Fr   r   r      Ti  )r3   r"   r/   r2   r+   r*   r   r4   )r5   r3   s     r6   tickPPU.tick   s    KK6K {{SDMM!,=$--PQBRVZVaVaBadKK3KMMQM}}dd			T!  
#	dm dddr9   c                     U R                   nU R                  U5        U(       d,  U R                   (       a  U R                  (       a  SU l        g g g g )NT)r   rc   r*   r4   )r5   r?   prev_nmis      r6   
write_ctrlPPU.write_ctrl   s?    HMM$$**t/?/?d 0@*Hr9   c                 P    U R                  5       nSU l        SU l        SU l        U$ )Nr   r   F)r   r*   r   r)   r>   s     r6   read_statusPPU.read_status   s)    ==?DDDDOKr9   c                 b    XR                   U R                  '   U R                  S-   S-  U l        g )Nr   r<   )r/   r.   r>   s     r6   write_oam_dataPPU.write_oam_data  s'    #'MM$-- ]]Q&$.DMr9   c                 |   U R                   S   S-  U R                   S   -  nSUs=::  a  S:  a2  O  O/XR                  U R                  U[        -
  S-	     S-  US-  -   '   O<US;   a  XR                  US	-  S
-  '   O!SUs=::  a  S:  a  O  OXR                  US
-  '   U R                  U R                  5       5        g )Nr   r;   r   r    0  
     )i?  i?  i?  i?  r[   r    ?   @  )r   r-   r   NAMETABLE_ADDRr0   rH   rO   )r5   r?   addrs      r6   
write_dataPPU.write_data  s    ??1"T__Q%77DX\ii~ 5 ;<Bte|TU	1	1+/llD4K4'(	4	 &	 "&ll4$; 	MM$))+,r9   c                    U R                   S   S-  U R                   S   -  nU R                  U R                  5       5        SUs=::  a  S:  a!  O  OU R                  U R                  U   5      $ SUs=::  a  S:  aA  O  O>U R                  U R
                  U R                  U[        -
  S-	     S-  US-  -      5      $ SUs=::  a  S	:  a  O  g U R                  US
-     $ g )Nr   r;   r   r   r   r   r   r   r   r   )	r   rH   rO   
use_bufferr   r-   r   r   r0   )r5   r   s     r6   	read_data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	 &	 \\$+&& 
!r9   c                 J    XR                   S  US U R                    -   U l        g rl   )r.   r/   r>   s     r6   write_oam_dmaPPU.write_oam_dma1  s(    
==>
>DMM 	Mr9   c                 ,    U R                   Uso l         U$ rl   )r1   )r5   exprouts      r6   r   PPU.use_buffer7  s    {{DCJr9   cartc                 x    UR                   U l         UR                  U l        [        U R                     U l        g rl   )r   screen_mirroringr   r   r   )r5   r   s     r6   attach_cartPPU.attach_cart;  s-    <<DL//D!$"5"56DNr9   c                 ^    [         R                  U l        [        U R                     U l        g rl   )r   r   r   r   r   rK   s    r6   detach_cartPPU.detach_cart@  s"    00D!$"5"56DNr9   c                 .    SU l         SU l        SU l        g )Nr   F)r2   r3   r4   rK   s    r6   reset	PPU.resetE  s    DMDKDr9   c                 6    U R                   (       a  SU l         gg)NFT)r4   rK   s    r6   poll_nmiPPU.poll_nmiJ  s     dr9   )#r   r   r1   r   r   r   r   r   r   r   r   r3   r   r   r    r$   r!   r#   r&   r%   r"   r   r   r4   r.   r/   r0   r2   r)   r'   r(   r,   r+   r*   r-   N)&__name__
__module____qualname____firstlineno__r7   r@   rD   rH   rL   rO   rT   rX   r\   rc   ri   rm   rs   rv   ry   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __static_attributes__ r9   r6   r
   r
      s    .f/%
A2)++))	:/
*8#/6 /-.'&7d 7
7

r9   r
   N)ppu_registersr   r   NAMETABLE_LENr   r   r
   r   r9   r6   <module>r      s*      @ @r9   