⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dma.inc

📁 NES game Emulator in Linux.c and asm codes.
💻 INC
字号:
%if 0

SNEeSe, an Open Source Super NES emulator.


Copyright (c) 1998-2004 Charles Bilyue'.
Portions Copyright (c) 2003-2004 Daniel Horchner.

This is free software.  See 'LICENSE' for details.
You must read and accept the license prior to use.

%endif

%include "cpu/cpumem.inc"
%include "cycles.inc"

%ifndef SNEeSe_dma_inc
%define SNEeSe_dma_inc

; (H)DMA macros
;
; Thanks to zsKnight for all the information which helped get this
; working right! (I hope!)

%ifndef SNEeSe_DMA_asm

EXTERN_C 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_C DMAP_%1
EXTERN_C BBAD_%1    ; Low byte of 0x21??
EXTERN DMA_Vid_%1
EXTERN NTRL_%1
EXTERN A1T_%1       ; Source Address L/H/B
EXTERN_C A1TL_%1    ; Source Address L
EXTERN_C A1TH_%1    ; Source Address H
EXTERN_C A1B_%1     ; Source Bank Address
EXTERN DAS_%1       ; Data Size L/H
EXTERN_C DASL_%1    ; Data Size L
EXTERN_C DASH_%1    ; Data Size H
EXTERN_C DASB_%1    ; Data address bank
EXTERN A2T_%1
EXTERN_C A2L_%1     ; HDMA table address L
EXTERN_C A2H_%1     ; HDMA table address H
EXTERN_C A2B_%1     ; HDMA table bank address

; HDMA_Siz_x - These hold the register size for HDMA
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_C MDMAEN,HDMAEN
EXTERN HDMAON,In_DMA
EXTERN DMA_Pending_B_Address,DMA_Pending_Data
EXTERN_C Do_DMA_Channel,Do_HDMA_Channel
EXTERN SNES_W420C
EXTERN do_HDMA
EXTERN Reset_DMA

%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

                         ; 0000dccc | d = in DMA/HDMA, if 0 all should be 0
;EXPORT In_DMA           ; c = channel # 0-7
%define DMA_IN_PROGRESS (1 << 3)
%define DMA_CHANNEL_MASK ((1 << 3) - 1)


; 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 HDMA_Siz 0x10
%define DMA_B0 0x14
%define DMA_B1 0x15
%define DMA_B2 0x16
%define DMA_B3 0x17
%define DMATableSize 0x18

%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
 dd C_LABEL(UNSUPPORTED_READ)
 ; 43xC-43xE: Open Bus A
 DUPLICATE dd,3,C_LABEL(CPU_OPEN_BUS_READ)
 dd C_LABEL(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,C_LABEL(UNSUPPORTED_WRITE)
%endmacro

%macro LOAD_DMA_TABLE 1
 mov edi,TableDMA%1
%endmacro

;%1 = num, 2 = branch target for early-exit
%macro DMAOPERATION 2
 mov al,[C_LABEL(MDMAEN)]
 test al,1 << (%1)
 jz %%no_dma

 mov byte [In_DMA],(%1) | DMA_IN_PROGRESS
 LOAD_DMA_TABLE %1

 call C_LABEL(Do_DMA_Channel)

 cmp byte [In_DMA],0
 jnz %2

 and byte [C_LABEL(MDMAEN)],~(1 << (%1))

%%no_dma:
%endmacro

%macro HDMAOPERATION 1
  mov al,[HDMAON]
  test al,(1<<%1)
  jz %%no_hdma

  add dword R_65c816_Cycles,byte 8  ; HDMA processing

  mov byte [In_DMA],(%1) | DMA_IN_PROGRESS
  LOAD_DMA_TABLE %1
  call C_LABEL(Do_HDMA_Channel) ; CF clear if channel disabled

  jc %%no_hdma
  and byte [HDMAON],~(1<<%1)    ; Disable this channel
%%no_hdma:
%endmacro

%macro RELATCH_HDMA_CHANNEL 1
 test byte [C_LABEL(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,[C_LABEL(HDMAEN)]
 mov [HDMAON],al
 test al,al
 jz %%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 ; !defined(SNEeSe_dma_inc)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -