
    ,g                     H    d dl mZ d dlmZ d dlmZ dZdZdZ G d d      Z	y	)
   )Cart)PPU)
Controlleri      i?  c                       e Zd Zdef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 Z!d  Z"d! Z#d" Z$d#e%fd$Z&d% Z'd*d&e(fd'Z)d*d(Z*y))+Busppuc                     t        d      | _        d | _        d d g| _        || _        d| _        d| _        | j                          | j                          | j                          | j                          y )N       )	bytearraymemorycartcontrollersr	   cyclesframesdef_read_func_idxdef_read_funcsdef_write_func_idxdef_write_funcs)selfr	   s     "d:\Programming\nes 3\engine\bus.py__init__zBus.__init__   sj    > G$DKDId|DDHDKDK 	    c                 2   t        d      D cg c]^  }|dk  rdnTd|cxk  rdk  rn ndnD|dk(  rdn=|dk(  rd	n6|d
k(  rdn/|dk(  rdn(|dk(  rdn!d|cxk  rdk  rn ndnd|cxk  rdk  rn ndnd` c}| _        t        | j                        | _        y c c}w )Nr   r   r      r   i                  @     @         @        )rangeread_func_idxr   r   addrs     r   r   z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   A#Bc                 b    t        d      D cg c]  }t        d|        c}| _        y c c}w )N	   zself.read_fun_)r*   eval
read_funcs)r   is     r   r   zBus.def_read_funcsN   s'    ;@8DatnQC01DDOD   ,c                 &    | j                   |dz     S Ni  )r   r,   s     r   
read_fun_0zBus.read_fun_0Q   s    T[[8K1K%LLr   c                 :    | j                   j                  |dz     S Nr   )r   prg_romr,   s     r   
read_fun_1zBus.read_fun_1R   s    TYY%6%6tf}%EEr   c                 6    | j                   j                         S N)r	   read_statusr,   s     r   
read_fun_2zBus.read_fun_2S   s    TXX%9%9%;;r   c                 \    | j                   j                  | j                   j                     S r<   )r	   oam_dataoam_addrr,   s     r   
read_fun_3zBus.read_fun_3T   s     TXX%6%6txx7H7H%IIr   c                 6    | j                   j                         S r<   )r	   	read_datar,   s     r   
read_fun_4zBus.read_fun_4U   s    TXX%7%7%99r   c                 ^    | j                   d   r| j                   d   j                         S dS Nr   r   readr,   s     r   
read_fun_5zBus.read_fun_5V   /    4CSCSTUCVT%5%5a%8%=%=%?]\]]r   c                 ^    | j                   d   r| j                   d   j                         S dS )Nr   r   rH   r,   s     r   
read_fun_6zBus.read_fun_6W   rK   r   c                 *    | j                  |dz        S Nr    )mem_readr,   s     r   
read_fun_7zBus.read_fun_7X   s    T]]4:M3M%NNr   c                      yrG    r,   s     r   
read_fun_8zBus.read_fun_8Y   s    Qr   c                 x   t        d      D cg c]  }|dk  rdnw|dk(  rdnp|dk(  rdni|dk(  rdnb|d	k(  rd
n[|dk(  rdnT|dk(  rdnM|dk(  rdnF|dk(  rdn?|dk(  rdn8|dk(  rdn1d|cxk  rdk  rn ndn!d|cxk  rdk  rn ndnd|cxk  rdk  rn ndnd c}| _        t        | j                        | _        y c c}w )Nr   r   r   r   i   r   i   r   r   r!   i   r#   i   r%   r    r(   i@  r)   r"   r/   r$   
   r&   r'      r         )r*   write_func_idxr   r,   s     r   r   z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B7c                 b    t        d      D cg c]  }t        d|        c}| _        y c c}w )N   zself.write_fun_)r*   r0   write_funcsr,   s     r   r   zBus.def_write_funcso   s(    CH9M4tf56MDMr3   c                 B    | j                   j                  |dz  |       y r5   )r   __setitem__r   r-   values      r   write_fun_0zBus.write_fun_0r   s    dkk&=&=dEX>XZ_&`r   c                 :    | j                   j                  |       y r<   )r	   
write_ctrlr`   s      r   write_fun_1zBus.write_fun_1s       dhh&9&9%&@r   c                 :    | j                   j                  |       y r<   )r	   mask_setr`   s      r   write_fun_2zBus.write_fun_2t   s    dhh&7&7&>r   c                 &    || j                   _        y r<   )r	   rA   r`   s      r   write_fun_3zBus.write_fun_3u   s    %dhh&7r   c                 :    | j                   j                  |       y r<   )r	   write_oam_datar`   s      r   write_fun_4zBus.write_fun_4v   s    dhh&=&=e&Dr   c                 :    | j                   j                  |       y r<   )r	   
scrl_writer`   s      r   write_fun_5zBus.write_fun_5w   rf   r   c                 :    | j                   j                  |       y r<   )r	   addr_updater`   s      r   write_fun_6zBus.write_fun_6x   s    dhh&:&:5&Ar   c                 :    | j                   j                  |       y r<   )r	   
write_datar`   s      r   write_fun_7zBus.write_fun_7y   rf   r   c                     | j                   j                  t        t        d      D cg c]  }| j	                  |dz  |z         c}             y c c}w )N   r)   )r	   write_oam_dmar   r*   rP   r   r-   ra   r2   s       r   write_fun_8zBus.write_fun_8z   sD    dhh&<&<YotuxoyGzjkV[_`V`cdVdHeGz={&|Gzs   Ac                 d    | j                   d   r| j                   d   j                  |       y d  y rG   r   writer`   s      r   write_fun_9zBus.write_fun_9{   s+    $JZJZ[\J]d&6&6q&9&?&?&Fcgr   c                 d    | j                   d   r| j                   d   j                  |       y d  y )Nr   r~   r`   s      r   write_fun_10zBus.write_fun_10|   s+    4K[K[\]K^t'7'7':'@'@'Gdhr   c                 .    | j                  |dz  |       y rO   )	mem_writer`   s      r   write_fun_11zBus.write_fun_11}   s    t~~d=P6PRW'Xr   c                 B    | j                   j                  |dz  |       y r8   )r   write_prg_romr`   s      r   write_fun_12zBus.write_fun_12~   s    tyy'>'>tf}e'Tr   c                      y r<   rS   r`   s      r   write_fun_13zBus.write_fun_13   s    sr   c                 F     | j                   | j                  |      |      S r<   )r1   r+   r   r   r9   r	   r=   read_oam_datarD   r   rI   rP   r,   s     r   rP   zBus.mem_read   s#    44??4--d34T::r   c                 J     | j                   | j                  |      ||       y r<   )r]   rZ   r   r	   rd   
write_maskwrite_oam_addrrm   write_scroll
write_addrrv   rz   r   r*   rP   r   r   r   r   r   r{   s       r   r   zBus.mem_write   s'    /DT((./e<
r   c                 2    t        d      | _        d| _        y )Nr   r   )r   r   r   r   s    r   resetz	Bus.reset   s    F#DKDKr   c                 n    |dz  }| xj                   |z  c_         | j                  j                  |       y )Nr   )r   r	   tick)r   
cpu_cyclesr   s      r   r   zBus.tick   s)    !^FKK6KHHMM&r   c                 6    | j                   j                         S r<   )r	   poll_nmir   s    r   r   zBus.poll_nmi   s    88r   r   c                 H    || _         | j                  j                  |       y r<   )r   r	   attach_cart)r   r   s     r   r   zBus.attach_cart   s    DIHHr   c                 F    d | _         | j                  j                          y r<   )r   r	   detach_cartr   s    r   r   zBus.detach_cart   s    DIHHr   
controllerc                 "    || j                   |<   y r<   r   )r   r   players      r   attach_controllerzBus.attach_controller   s    )DVr   c                 "    d | j                   |<   y r<   r   )r   r   s     r   detach_controllerzBus.detach_controller   s    #DVr   N)r   )+__name__
__module____qualname__r   r   r   r   r6   r:   r>   rB   rE   rJ   rM   rQ   rT   r   r   rb   re   ri   rk   rn   rq   rt   rw   r|   r   r   r   r   r   rP   r   r   r   r   r   r   r   r   r   r   rS   r   r   r   r      s    /# /d7E ME;I9]]N&9(N a@>?D@A@|ghXT*,Q.
d ** *$r   r   N)
r   r   r	   r   r   r   RAM_MIRRORS_ENDPPU_REGISTERSPPU_REGISTERS_MIRRORS_ENDr   rS   r   r   <module>r      s,      " " {$ {$r   