MagicEngine
Forums
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 
 Japanese English 

a DMA routine for HuC

 
Post new topic   Reply to topic    MagicEngine Forum Index -> General
View previous topic :: View next topic  
Author Message
Tomaitheous
Elder
Elder


Joined: 27 Sep 2005
Posts: 306
Location: Tucson

PostPosted: Fri May 19, 2006 11:50 pm    Post subject: a DMA routine for HuC Reply with quote

Here's a small DMA routine for use with HuC. The PCE has a total of five DMA instructions - I actually didn't notice a fifth one until today Very Happy

I made the interface C friendly. The instructions on it use are inside the DMA_RTN.h file. The destination can be anywhere - VDC, VCE, memory, SGX data port($0012), etc. You're not limited to global variables when assigning the parameters, but it's prefered for speed when used in loops.

The speed of the DMA is at ASM level since it's a block transfer instruction, but the arguement assigning is handled via the HuC compiler for flexibility and ease of use. If there is a need for a fast parameter setup in clock cycle resitrictive loops, let me know and I'll see what I can come up with.

Here's the file - http://pcedev.net/HuC/Dma_rtn.zip


-Rich

[Edit]
The DMA routine does not load BANK that contains the specific DATA pointed by routine.

For bandaid fix, do a
Code:
var=source_data[x]
each time in HuC to prime the bank, before using START_DMA() - until I can update the code.

If you use DMA_SRC=DATA right before START_DMA, you should be ok as this should cause HuC to load the corrosponding bank inwhich the DATA is pointed to.

[Edit]#2
DMA_SRC=DATA does not trigger the BANK switch - probably because it's a #define instead of a var. Use a global var to trigger the bank switch,i.e. force_bank=data[0]; .
_________________
www.pcedev.net
Back to top
View user's profile Send private message
ccovell
Regular
Regular


Joined: 19 Dec 2005
Posts: 100
Location: Japan

PostPosted: Sat May 20, 2006 1:45 pm    Post subject: Reply with quote

What a coincidence! I too recently discovered the wonders of the block transfer instructions, and replaced some slow routines (sprite DMA) with fast ones for use with MagicKit.

Anyway, for reference to ASM people, since the TIA, TII, etc. instructions take hard coded values, the best way to use them is to have a subroutine that copies them to 8 bytes in RAM, so you can modify the instruction type, parameters, and then just JSR to this routine. Like so:

RAM_Routine:
TIA $SSSS,$DDDD,$LLLL
RTS
_________________
http://www.chrismcovell.com
Back to top
View user's profile Send private message Visit poster's website
Tomaitheous
Elder
Elder


Joined: 27 Sep 2005
Posts: 306
Location: Tucson

PostPosted: Sat May 20, 2006 3:51 pm    Post subject: Reply with quote

Yup, a JSR to the code in ram Very Happy .
I ended up using 12bytes since I need WORD alignment for ease of use with HuC.


BTW Chris, Do you know what address in ZP are reserved for the user? All my code functions/macros and libs in magickit were custom, so I didn't have to worry about ZP issues, but now that I'm using HuC(which compiles an S file using magickit) I not sure what address on the ZP are available to users by default?


-Rich
_________________
www.pcedev.net
Back to top
View user's profile Send private message
ccovell
Regular
Regular


Joined: 19 Dec 2005
Posts: 100
Location: Japan

PostPosted: Sat May 20, 2006 6:23 pm    Post subject: Reply with quote

Sorry, I don't use HuC at all...
_________________
http://www.chrismcovell.com
Back to top
View user's profile Send private message Visit poster's website
Tomaitheous
Elder
Elder


Joined: 27 Sep 2005
Posts: 306
Location: Tucson

PostPosted: Sat May 20, 2006 7:32 pm    Post subject: Reply with quote

Sorry, I was refering more to magickit than HuC.

Anyway, I figured it out. I just need to assign variables in the zerpage without the .org directive and after all the library functions are inlcuded and assigned.

Code:

#asm
         .zp
         test1: .ds 1
#endasm


Still have a problem in that HuC can't read a variable name if it's delcared inside the ASM directive, so I just need to figure out how to setup variables in ZP for C.

***UPDATE***

I updated the file/zip. The old code used an array to house and access the parameters, which generated 315bytes of code for this..

Code:

DMA_TYPE=TIA;
DMA_SRC=bg_chr;
DMA_DSTN=0x0012;
DMA_LEN=0x1200;
START_DMA();


I changed it to "INT a, b, c, d" which cut it down to 28bytes. Much faster Laughing

Btw, it looks like magickit lib already has a DMA routine loaded into ram, though it looks like its TIA only as the title load_vram suggest.

Code:

  792                     ; ----
  793                     ; load_vram
  794                     ; ----
  795                     ; copy a block of memory to VRAM
  796                     ; ----
  797                     ; IN :  _DI = VRAM location
  798                     ;       _BL = data bank
  799                     ;       _SI = data memory location
  800                     ;       _CX = number of words to copy
  801                     ; ----
  802           26CC              .bss
  803                     
  804                     ; This actually places a 'TIA' command
  805                     ; into RAM, from which to execute
  806                     ; for BLiT to VRAM for SATB transfer
  807                     ; and other VRAM load functions
  808                     
  809  --:26CC            _ram_hdwr_tia           .ds     1
  810  --:26CD            _ram_hdwr_tia_src       .ds     2
  811  --:26CF            _ram_hdwr_tia_dest      .ds     2
  812  --:26D1            _ram_hdwr_tia_size      .ds     2
  813  --:26D3            _ram_hdwr_tia_rts       .ds     1

_________________
www.pcedev.net
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    MagicEngine Forum Index -> General All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group