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