
    ?h                     H    S SK Jr  S SKJr  S SKJr  SrSrSr " S S5      r	g	)
   )Cart)PPU)
Controlleri      i?  c                      \ rS rSrS\4S j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" r$S# r%S$\&4S% jr'S& r(S,S'\)4S( jjr*S,S) jr+S*r,g+)-Bus   ppuc                     [        S5      U l        S U l        S S /U l        Xl        SU l        SU l        U R                  5         U R                  5         U R                  5         U R                  5         g )N       )	bytearraymemorycartcontrollersr
   cyclesframesdef_read_func_idxdef_read_funcsdef_write_func_idxdef_write_funcs)selfr
   s     9C:\Users\trevor\Downloads\nes_v0.5\nes_v0.5\engine\bus.py__init__Bus.__init__   sh    > G$DKDId|DHDKDK 	    c                 P   [        S5       Vs/ s Hk  nUS:  a  SO_SUs=::  a  S:  a  O  OSOMUS:X  a  SOEUS:X  a  S	O=US
:X  a  SO5US:X  a  SO-US:X  a  SO%SUs=::  a  S:  a  O  OSOSUs=::  a  S:  a  O  OSOSPMm     snU l        [        U R                  5      U l        g s  snf )Nr   r   r      r   i                  @     @         @        )rangeread_func_idxr   r   addrs     r   r   Bus.def_read_func_idx?   s     g   &=aT#G#a6>a6>a6>a6>a6>aT"F"aT"F"a	  D #4#5#56D s   A2B#c                 h    [        S5       Vs/ s H  n[        SU 35      PM     snU l        g s  snf )N	   zself.read_fun_)r,   eval
read_funcs)r   is     r   r   Bus.def_read_funcsN   s+    ;@8D8atnQC018DDOD   /c                 &    U R                   US-     $ Ni  )r   r.   s     r   
read_fun_0Bus.read_fun_0Q   s    T[[8K1K%LLr   c                 :    U R                   R                  US-     $ Nr   )r   prg_romr.   s     r   
read_fun_1Bus.read_fun_1R   s    TYY%6%6tf}%EEr   c                 6    U R                   R                  5       $ N)r
   read_statusr.   s     r   
read_fun_2Bus.read_fun_2S   s    TXX%9%9%;;r   c                 \    U R                   R                  U R                   R                     $ rB   )r
   oam_dataoam_addrr.   s     r   
read_fun_3Bus.read_fun_3T   s     TXX%6%6txx7H7H%IIr   c                 6    U R                   R                  5       $ rB   )r
   	read_datar.   s     r   
read_fun_4Bus.read_fun_4U   s    TXX%7%7%99r   c                 h    U R                   S   (       a  U R                   S   R                  5       $ S$ Nr   r   readr.   s     r   
read_fun_5Bus.read_fun_5V   /    4CSCSTUCVT%5%5a%8%=%=%?]\]]r   c                 h    U R                   S   (       a  U R                   S   R                  5       $ S$ )Nr   r   rQ   r.   s     r   
read_fun_6Bus.read_fun_6W   rU   r   c                 *    U R                  US-  5      $ Nr"   )mem_readr.   s     r   
read_fun_7Bus.read_fun_7X   s    T]]4:M3M%NNr   c                     grP    r.   s     r   
read_fun_8Bus.read_fun_8Y   s    Qr   c                    [        S5       Vs/ s H  nUS:  a  SOUS:X  a  SOUS:X  a  SOwUS:X  a  SOoUS	:X  a  S
OgUS:X  a  SO_US:X  a  SOWUS:X  a  SOOUS:X  a  SOGUS:X  a  SO?US:X  a  SO7SUs=::  a  S:  a  O  OSO%SUs=::  a  S:  a  O  OSOSUs=::  a  S:  a  O  OSOSPM     snU l        [        U R                  5      U l        g s  snf )Nr   r   r   r   i   r   i   r!   r    r#   i   r%   i   r'   r"   r*   i@  r+   r$   r2   r&   
   r(   r)   r	   r         )r,   write_func_idxr   r.   s     r   r   Bus.def_write_func_idx[   s    " g!    &=a6>a6>a6>a6>a6>a6>a6>a6>a6>aFNbd#V#bd$W$bd#V#b ! D" $D$7$78D# s   BCc                 h    [        S5       Vs/ s H  n[        SU 35      PM     snU l        g s  snf )N   zself.write_fun_)r,   r3   write_funcsr.   s     r   r   Bus.def_write_funcso   s,    CH9M94tf569MDMr7   c                 B    U R                   R                  US-  U5        g r9   )r   __setitem__r   r/   values      r   write_fun_0Bus.write_fun_0r   s    dkk&=&=dEX>XZ_&`r   c                 :    U R                   R                  U5        g rB   )r
   
write_ctrlrn   s      r   write_fun_1Bus.write_fun_1s       dhh&9&9%&@r   c                 :    U R                   R                  U5        g rB   )r
   mask_setrn   s      r   write_fun_2Bus.write_fun_2t   s    dhh&7&7&>r   c                 $    X R                   l        g rB   )r
   rH   rn   s      r   write_fun_3Bus.write_fun_3u   s    %hh&7r   c                 :    U R                   R                  U5        g rB   )r
   write_oam_datarn   s      r   write_fun_4Bus.write_fun_4v   s    dhh&=&=e&Dr   c                 :    U R                   R                  U5        g rB   )r
   
scrl_writern   s      r   write_fun_5Bus.write_fun_5w   rv   r   c                 :    U R                   R                  U5        g rB   )r
   addr_updatern   s      r   write_fun_6Bus.write_fun_6x   s    dhh&:&:5&Ar   c                 :    U R                   R                  U5        g rB   )r
   
write_datarn   s      r   write_fun_7Bus.write_fun_7y   rv   r   c                     U R                   R                  [        [        S5       Vs/ s H  o0R	                  US-  U-  5      PM     sn5      5        g s  snf )N   r+   )r
   write_oam_dmar   r,   r[   r   r/   ro   r5   s       r   write_fun_8Bus.write_fun_8z   sH    dhh&<&<YotuxoyGzoyjkV[_`V`cdVdHeoyGz={&|Gzs    Ac                 n    U R                   S   (       a  U R                   S   R                  U5        g S   g rP   r   writern   s      r   write_fun_9Bus.write_fun_9{   s+    $JZJZ[\J]d&6&6q&9&?&?&Fcgr   c                 n    U R                   S   (       a  U R                   S   R                  U5        g S   g )Nr   r   rn   s      r   write_fun_10Bus.write_fun_10|   s+    4K[K[\]K^t'7'7':'@'@'Gdhr   c                 .    U R                  US-  U5        g rZ   )	mem_writern   s      r   write_fun_11Bus.write_fun_11}   s    t~~d=P6PRW'Xr   c                 B    U R                   R                  US-  U5        g r=   )r   write_prg_romrn   s      r   write_fun_12Bus.write_fun_12~   s    tyy'>'>tf}e'Tr   c                     g rB   r_   rn   s      r   write_fun_13Bus.write_fun_13   s    tr   c                 T    U R                   U R                  U      " U5      nUb  U$ S$ rP   )r4   r-   r   r   r>   r
   rC   read_oam_datarL   r   rR   r[   )r   r/   rR   s      r   r[   Bus.mem_read   s0    ??4--d34T:D#4--r   c                 H    U R                   U R                  U      " X5        g rB   )rj   rf   r   r
   rs   
write_maskwrite_oam_addrr   write_scroll
write_addrr   r   r   r,   r[   r   r   r   r   r   r   s       r   r   Bus.mem_write   s#    T((./<
r   c                 2    [        S5      U l        SU l        g )Nr   r   )r   r   r   r   s    r   reset	Bus.reset   s    F#DKDKr   c                 n    US-  nU =R                   U-  sl         U R                  R                  U5        g )Nr!   )r   r
   tick)r   
cpu_cyclesr   s      r   r   Bus.tick   s)    !^FKK6KHHMM&r   c                 6    U R                   R                  5       $ rB   )r
   poll_nmir   s    r   r   Bus.poll_nmi   s    88r   r   c                 F    Xl         U R                  R                  U5        g rB   )r   r
   attach_cart)r   r   s     r   r   Bus.attach_cart   s    IHHr   c                 F    S U l         U R                  R                  5         g rB   )r   r
   detach_cartr   s    r   r   Bus.detach_cart   s    DIHHr   
controllerc                      XR                   U'   g rB   r   )r   r   players      r   attach_controllerBus.attach_controller   s    )Vr   c                 "    S U R                   U'   g rB   r   )r   r   s     r   detach_controllerBus.detach_controller   s    #DVr   )
r   r   r   r   r   r
   r-   r4   rf   rj   N)r   )-__name__
__module____qualname____firstlineno__r   r   r   r   r:   r?   rD   rI   rM   rS   rW   r\   r`   r   r   rp   rt   ry   r|   r   r   r   r   r   r   r   r   r   r   r[   r   r   r   r   r   r   r   r   r   r   __static_attributes__r_   r   r   r   r      s    /# /d7E ME;I9]]N&9(N a@>?D@A@|ghXT+0Q.
d ** *$r   r   N)
r   r   r
   r   r   r   RAM_MIRRORS_ENDPPU_REGISTERSPPU_REGISTERS_MIRRORS_ENDr   r_   r   r   <module>r      s,      " " }$ }$r   