From ad7e128bb42fbedb6c346861eb545ea28752eed7 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Thu, 24 Aug 2023 09:02:00 +0000 Subject: [PATCH] README: update DMA "add mode" documentation --- README.rst | 91 ++++++++++++++++++++++++++++++++++---------------- dsp-notes.ods | Bin 39107 -> 39936 bytes 2 files changed, 62 insertions(+), 29 deletions(-) diff --git a/README.rst b/README.rst index ccad034..bfd1227 100644 --- a/README.rst +++ b/README.rst @@ -59,35 +59,6 @@ This change is not consistent with what is written in the SCU manual Differences that affect code generation ======================================= -DMA default "add mode" ----------------------- - -``dspasm.exe`` has a bug where, despite the SCU manual -(ST-97-R5-072694) claiming that the default DMA "add mode" is ``1``, -the generated code is "add mode" ``2``. - -This bug is documented in "Sega Developers Conference Conference -Proceedings March 5 7, 1996" on pdf page 48, printed page 3-14, -slide 25. However, Sega of America did not fully understand the nature -of the bug: patching ``dspasm.exe`` output is not necessary, because -``dspasm.exe`` does in fact generate the correct code for the ``DMA1`` -mnemonic. - -In short: - -- ``dspasm.exe`` assembles ``DMA`` as the equivalent of the ``DMA2`` - mnemonic - -- scu-dsp-asm assembles ``DMA`` as the equivalent of the ``DMA1`` - -.. note:: - - It is unclear which of these is correct. A future version of - scu-dsp-asm may change this behavior. - - The documentation, dspasm.exe, and the real SCU DSP are each - representing this in a mutually inconsistent way. - Spurious invalid X-bus opcode generation ---------------------------------------- @@ -119,3 +90,65 @@ Motorola S-record output is not supported Instead, scu-dsp-asm currently emits a raw binary file that contains fully assembled SCU DSP code. + +Misleading, contradictory, and completely incorrect documentation +================================================================= + +DMA default "add mode" +---------------------- + +Contrast to what is written in the SCU manual (ST-97-R5-072694), the +default DMA "add mode" for both dspasm.exe and scp-dsp-asm is +``2``. E.g: + +- ``DMA`` is a synonym for ``DMA2`` + +- ``DMAH`` is a synonym for ``DMAH2`` + +In "Sega Developers Conference Conference Proceedings March 5-7, 1996" +pdf page 48, printed page 3-14, slide 25: + + You need to modify your object code, either by hand or with a + custom tool. + +This is completely incorrect, and both scu-dsp-asm and dspasm.exe will +emit "add mode 1" via the ``DMA1`` and ``DMAH1`` mnemonics. + +DMA "add mode" and bytes +------------------------ + +All of the documentation you have read is invalid; here is the correct +relationship between DMA "add mode" mnemonics, and the number of +incremented bytes: + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - mnemonic + - D0 → [RAM] + - [RAM] →D0 + * - DMA0 + - 0 bytes + - 0 bytes + * - DMA1 + - 0 bytes + - 2 bytes + * - DMA2 + - 4 bytes + - 4 bytes + * - DMA4 + - 4 bytes + - 8 bytes + * - DMA8 + - 0 bytes + - 16 bytes + * - DMA16 + - 0 bytes + - 32 bytes + * - DMA32 + - 4 bytes + - 64 bytes + * - DMA64 + - 4 bytes + - 128 bytes diff --git a/dsp-notes.ods b/dsp-notes.ods index ea8087ac5f831c8803795f5058bbb2521226154f..f25ba682b41bd46c3fdaa26814f1eeb222e23611 100644 GIT binary patch delta 10728 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 M=>#wm3BQg12j-%-mjD0&