www.pudn.com > sn068s.zip > DMA.NI
%ifndef SNEeSe_DMA_i %define SNEeSe_DMA_i ; (H)DMA macros ; ; Thanks to zsKnight for all the information which helped get this ; working right! (I hope!) %ifndef SNEeSe_DMA_asm extern _DMA_text_start,_DMA_data_start,_DMA_bss_start %macro EXTERN_DMA_DATA 1 extern TableDMA%1 ; dh0bcttt d=CPU->PPU,h=addr,b=inc/dec,c=inc/fixed,t=type extern _DMAP_%1 extern _BBAD_%1 ; Low byte of 0x21?? extern DMA_Vid_%1 extern NTRL_%1 extern A1T_%1 ; Source Address L/H/B extern _A1TL_%1 ; Source Address L extern _A1TH_%1 ; Source Address H extern _A1B_%1 ; Source Bank Address extern DAS_%1 ; Data Size L/H extern _DASL_%1 ; Data Size L extern _DASH_%1 ; Data Size H extern _DASB_%1 ; Data address bank extern A2T_%1 extern _A2L_%1 ; HDMA table address L extern _A2H_%1 ; HDMA table address H extern _A2B_%1 ; HDMA table bank address ; DMA_Wr#_x - These hold the write handlers for DMA ; DMA_Rd#_x - These hold the read handlers for DMA ; HDMA_Siz_x - These hold the register size for HDMA extern DMA_Wr0_%1 extern DMA_Wr1_%1 extern DMA_Wr2_%1 extern DMA_Wr3_%1 extern DMA_Rd0_%1 extern DMA_Rd1_%1 extern DMA_Rd2_%1 extern DMA_Rd3_%1 extern DMA_B0_%1 extern DMA_B1_%1 extern DMA_B2_%1 extern DMA_B3_%1 extern HDMA_Siz_%1 %endmacro EXTERN_DMA_DATA 0 EXTERN_DMA_DATA 1 EXTERN_DMA_DATA 2 EXTERN_DMA_DATA 3 EXTERN_DMA_DATA 4 EXTERN_DMA_DATA 5 EXTERN_DMA_DATA 6 EXTERN_DMA_DATA 7 extern _MDMAEN,_HDMAEN,HDMAON,In_DMA extern _Do_DMA_Channel,_Do_HDMA_Channel extern SNES_R420B,SNES_R420C,SNES_W420B,SNES_W420C extern do_HDMA extern Reset_DMA extern _Update_DMA_PPU_Handlers,Update_DMA_PPU_Handlers %macro EXTERN_MAP_READ_DMA 1 extern MAP_READ_DMAP%1 extern MAP_READ_BBAD%1 extern MAP_READ_A1TL%1 extern MAP_READ_A1TH%1 extern MAP_READ_A1B%1 extern MAP_READ_DASL%1 extern MAP_READ_DASH%1 extern MAP_READ_DASB%1 extern MAP_READ_A2L%1 extern MAP_READ_A2H%1 extern MAP_READ_NTRL%1 %endmacro EXTERN_MAP_READ_DMA 0 EXTERN_MAP_READ_DMA 1 EXTERN_MAP_READ_DMA 2 EXTERN_MAP_READ_DMA 3 EXTERN_MAP_READ_DMA 4 EXTERN_MAP_READ_DMA 5 EXTERN_MAP_READ_DMA 6 EXTERN_MAP_READ_DMA 7 %macro EXTERN_MAP_WRITE_DMA 1 extern MAP_WRITE_DMAP%1 extern MAP_WRITE_BBAD%1 extern MAP_WRITE_A1TL%1 extern MAP_WRITE_A1TH%1 extern MAP_WRITE_A1B%1 extern MAP_WRITE_DASL%1 extern MAP_WRITE_DASH%1 extern MAP_WRITE_DASB%1 extern MAP_WRITE_A2L%1 extern MAP_WRITE_A2H%1 extern MAP_WRITE_NTRL%1 %endmacro EXTERN_MAP_WRITE_DMA 0 EXTERN_MAP_WRITE_DMA 1 EXTERN_MAP_WRITE_DMA 2 EXTERN_MAP_WRITE_DMA 3 EXTERN_MAP_WRITE_DMA 4 EXTERN_MAP_WRITE_DMA 5 EXTERN_MAP_WRITE_DMA 6 EXTERN_MAP_WRITE_DMA 7 %endif ; Offsets from TableDMA# %define DMAP 0 %define BBAD 1 %define DMA_Vid BBAD %define NTRL 2 %define DMA_Inc 3 %define A1T 4 %define A1TL A1T %define A1TH (A1T+1) %define A1B (A1T+2) %define DAS 8 %define DASL DAS %define DASH (DAS+1) %define DASB (DAS+2) %define A2T 0x0C %define A2L A2T %define A2H (A2T+1) %define A2B (A2T+2) %define DMA_Wr0 0x10 %define DMA_Wr1 0x14 %define DMA_Wr2 0x18 %define DMA_Wr3 0x1C %define DMA_Rd0 0x20 %define DMA_Rd1 0x24 %define DMA_Rd2 0x28 %define DMA_Rd3 0x2C %define DMA_B0 0x30 %define DMA_B1 0x34 %define DMA_B2 0x38 %define DMA_B3 0x3C %define HDMA_Siz 0x40 %define DMATableSize 0x44 %macro MAP_READ_DMA_LIST 1 dd MAP_READ_DMAP%1 dd MAP_READ_BBAD%1 dd MAP_READ_A1TL%1 dd MAP_READ_A1TH%1 dd MAP_READ_A1B%1 dd MAP_READ_DASL%1 dd MAP_READ_DASH%1 dd MAP_READ_DASB%1 dd MAP_READ_A2L%1 dd MAP_READ_A2H%1 dd MAP_READ_NTRL%1 DUPLICATE dd,5,UNSUPPORTED_READ %endmacro %macro MAP_WRITE_DMA_LIST 1 dd MAP_WRITE_DMAP%1 dd MAP_WRITE_BBAD%1 dd MAP_WRITE_A1TL%1 dd MAP_WRITE_A1TH%1 dd MAP_WRITE_A1B%1 dd MAP_WRITE_DASL%1 dd MAP_WRITE_DASH%1 dd MAP_WRITE_DASB%1 dd MAP_WRITE_A2L%1 dd MAP_WRITE_A2H%1 dd MAP_WRITE_NTRL%1 DUPLICATE dd,5,UNSUPPORTED_WRITE %endmacro %macro LOAD_DMA_TABLE 1 mov edx,TableDMA%1 %endmacro %macro HDMAOPERATION 1 mov al,[HDMAON] test al,(1<<%1) jz %%no_hdma mov byte [In_DMA],%1 LOAD_DMA_TABLE %1 call Do_HDMA_Channel ; CF clear if channel disabled jc %%no_hdma mov al,[HDMAON] and al,~(1<<%1) mov [HDMAON],al ; Disable this channel %%no_hdma: %endmacro %macro RELATCH_HDMA_CHANNEL 1 test byte [_HDMAEN],(1<<%1) jz %%no_relatch mov byte [NTRL_%1],0 mov eax,[A1T_%1] ; Src Address in ebx mov [A2T_%1],eax %%no_relatch: %endmacro %macro RELATCH_HDMA_IN_FRAME 1 %if 0 mov al,[HDMAON] not al and al,[esp] test al,(1<<%1) jz %%no_relatch mov byte [NTRL_%1],0 %%no_relatch: %endif %endmacro %macro RELATCH_HDMA 0 mov al,[_HDMAEN] mov [HDMAON],al test al,al jz near %%no_hdma RELATCH_HDMA_CHANNEL 0 RELATCH_HDMA_CHANNEL 1 RELATCH_HDMA_CHANNEL 2 RELATCH_HDMA_CHANNEL 3 RELATCH_HDMA_CHANNEL 4 RELATCH_HDMA_CHANNEL 5 RELATCH_HDMA_CHANNEL 6 RELATCH_HDMA_CHANNEL 7 %%no_hdma: %endmacro %endif ; SNEeSe_DMA_i