From dcfe30ad568ed21cce1891d6402e726b0afeb723 Mon Sep 17 00:00:00 2001 From: kg68k <78926718+kg68k@users.noreply.github.com> Date: Sat, 25 Mar 2023 01:28:29 +0900 Subject: [PATCH] add v1.02 files --- Makefile | 39 + README.md | 34 + src/Makefile | 50 + src/pcm8a.doc | 436 ++ src/pcm8a.s | 12880 +++++++++++++++++++++++++++++++++++++++++++++ src/pcm8atec.doc | 1480 ++++++ src/pcm8avup.doc | 474 ++ 7 files changed, 15393 insertions(+) create mode 100644 Makefile create mode 100644 README.md create mode 100644 src/Makefile create mode 100644 src/pcm8a.doc create mode 100644 src/pcm8a.s create mode 100644 src/pcm8atec.doc create mode 100644 src/pcm8avup.doc diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a1c0f1d --- /dev/null +++ b/Makefile @@ -0,0 +1,39 @@ +# Makefile for pcm8a (convert source code from UTF-8 to Shift_JIS) +# Do not use non-ASCII characters in this file. + +MKDIR_P = mkdir -p +U8TOSJ = u8tosj + +SRC_DIR = src +BLD_DIR = build + + +SRCS = $(wildcard $(SRC_DIR)/*) +SJ_SRCS = $(subst $(SRC_DIR)/,$(BLD_DIR)/,$(SRCS)) + + +.PHONY: all directories clean distclean + +all: directories $(SJ_SRCS) + +directories: $(BLD_DIR) + +$(BLD_DIR): + $(MKDIR_P) $@ + + +# convert src/* (UTF-8) to build/* (Shift_JIS) +$(BLD_DIR)/%: $(SRC_DIR)/% + $(U8TOSJ) < $^ >! $@ + + + +clean: + rm -f $(SJ_SRCS) + +distclean: + -rm -f $(SJ_SRCS) + -rmdir $(BLD_DIR) + + +# EOF diff --git a/README.md b/README.md new file mode 100644 index 0000000..e616a6c --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ +# PCM8A 改造版 + +PCM8A の改造版です。 + +無保証です。 +十分なテストを行っていないので、不具合があるかもしれません。 + + +## Build +PC やネット上で扱いやすくするために、ソースファイルは UTF-8 で記述されています。 +X68000 上でビルドする際には、UTF-8 から Shift_JIS への変換が必要です。 + +### u8tosj を使用する方法 + +あらかじめ、[u8tosj](https://github.com/kg68k/u8tosj) をビルドしてインストールしておいてください。 + +トップディレクトリで make を実行してください。以下の処理が行われます。 +1. build ディレクトリの作成。 +2. si.txt を Shift_JIS に変換して build/ へ保存。 +3. src/ 内の各ファイルを Shift_JIS に変換して build/ へ保存。 + +次に、カレントディレクトリを build/ に変更し、make を実行してください。 +実行ファイルが作成されます。 + +### u8tosj を使用しない方法 + +ファイルを適当なツールで適宜 Shift_JIS に変換してから make を実行してください。 +UTF-8 のままでは正しくビルドできませんので注意してください。 + + +## Author +原著作者: philly 氏 + +改造版作者: TcbnErik / https://github.com/kg68k/pcm8a diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..13b5f0e --- /dev/null +++ b/src/Makefile @@ -0,0 +1,50 @@ +# Makefile for pcm8a + +ifeq ($(notdir $(CURDIR)),src) +$(error do not execute make in src directory) +endif + +AS = has +ASFLAGS = +LD = hlk +LDFLAGS = + +BINDIR = /usr/local/bin +MANDIR = /usr/local/man/cat1 + +SRCS = pcm8a.s +OBJS = $(SRCS:.s=.o) +PCM8A_X = pcm8a.x +DOCS = pcm8a.doc pcm8atec.doc pcm8avup.doc README.md + +DIST_ZIP = pcm8a.zip +ARCS = $(DIST_ZIP) + +all: $(PCM8A_X) + + +$(DIST_ZIP): $(DOCS) $(PCM8A_X) + rm -f $@ + zip -9 $@ $^ + +$(SRC_ZIP): Makefile $(SRCS) + rm -f $@ + zip -9 $@ $^ + + +$(PCM8A_X): $(OBJS) + $(LD) $(LDFLAGS) -o $@ $(OBJS) + +%.o: %.s + $(AS) $(ASFLAGS) $< + + +install: + cp -p $(PCM8A_X) $(BINDIR) + cp -p $(DOCS) $(MANDIR) + +clean: + rm -f $(PCM8A_X) $(OBJS) $(ARCS) + + +# EOF diff --git a/src/pcm8a.doc b/src/pcm8a.doc new file mode 100644 index 0000000..2d0beb5 --- /dev/null +++ b/src/pcm8a.doc @@ -0,0 +1,436 @@ +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ ┃ +┃ リアルタイム ADPCM多重再生ドライバー 『PCM8A』 ┃ +┃ ┃ +┃ version 1.02 philly 1993-1997 ┃ +┃ ┃ +┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + +  PCM8.X (c)H.Etoh (以下 PCM8 と略します)相当のプログラムに +  MPCM.X (c)wachoman (以下 MPCM と略します)相当の機能を追加したプログ + ラムです + + +▲基本機能 + + 1)X680x0のADPCM出力を、複数の出力がリアルタイムでできるよう +   にする常駐型ドライバーです + + 2)10MHzの機種でも8チャンネル同時出力が可能です +   (モードによっては、8チャンネルを出力できないことがあります) + + 3)チャンネル毎に音程および音量を自在に指定することができます +   (MPCMモード時) + +▲ PCM8( version 0.48/0.48a/0.48b )及び MPCM とは以下の差異があります + + 1)ADPCM出力時、少し高速になっています +   欠点:多少音質が低下しています(高速化の弊害です) + + 2)ADPCM出力は音量変換しても処理速度は変わりません +   (16/8ビットPCMは音量変換を行うと処理速度が低下します) + + 3)音量の可変範囲を広げ、音量の設定数を増やしました +   (可変範囲 : -53dB ~ +26dB , 97段階 ) + + 4)MPCM 相当の音程変換機能を搭載しました +   (MPCM.X と置き換えて使用可能です) + + 5)チャンネル数/処理バイト数/音量の可変範囲が変更できます +   (常駐時に指定すると、常駐サイズが変化します) + + 6)デバイスドライバとして登録可能です +   (デバイスドライバとして登録されていても常駐解除できます) + + 7)Xellent30シリーズのローカルSRAM上での動作に対応 +   (Xellent30シリーズは、東京システムリサーチ株式会社製のアク +    セラレータボードです) + + 8)040turboに対応 +   (040turboは、BEEPs氏開発 ,株式会社 計測技研が販売する +    アクセラレータボードです) + + 9)ツクモ製16MB増設メモリ(16MBハイメモリ)上の常駐動作に対応 + + 10)ラスター割り込みに対応 +   (MPCMモードでは不完全になる場合があります) + + 11)ADPCMのクロックアップに対応 + + 12)欠点:プログラムサイズ・常駐サイズが PCM8 より大きくなっています +   (プログラム 70K バイト , 常駐 230K ~標準:370K~ 400K バイト) + + +▲使用方法 + + 基本的に PCM8 と同じになっていますが、機能を一部追加しています。 + (追加機能の詳細は PCM8ATEC.DOC を参照してください) + + コマンドラインからは PCM8A [スイッチ] で組み込まれます。 + + また、CONFIG.SYS からは DEVICE= の指定で組み込むことができ、デバイス名は +PCM (または @PCM) となります。 + + スイッチは以下の通りです。 + + ON :多重再生許可(デフォルト) + + OFF :多重再生禁止 + + FNC :trap #2 のファンクションコールのみ多重再生可能 +  IOCSは単音再生となります + + CLR :全チャンネルを初期化します +  動作モードの設定は変わりません + + -R :常駐解除 +  他のアプリケーションにより解除が禁止されている場合は解除 +  できません +  CONFIG.SYS 中で指定すると、PCM8A がメモリ上に残ったまま +  常駐が解除された状態になり、次に PCM8A を常駐させる時に +  メモリ上に残っていた PCM8A が有効になります + + -D[num] :動作状態表示モード設定 +  num =  0 :OFF(デフォルト) +  1 :ON + 省略 :OFF/ON 状態反転 + + -V[num] :音量可変モード設定 +  num =  0 :音量固定 +  1 :音量可変(デフォルト) + 省略 :固定/可変 状態反転 +  音量固定にすると、それ以降の出力は原音固定となります + + -Inum :IOCSで使用可能なチャンネルの最大数 +  num = 0 ~ 9 (デフォルト = 9 ) +  0 に設定すると、IOCS出力が禁止されます + + -N :デバイスドライバ組み込み時に指定すると、デバイス名を +   @PCM にして組み込みます +  コマンドラインからの常駐時に指定しても無視します + + -S[num1],[num2],[num3],[num4] + :システムの状態設定 +  num1 :最大チャンネル数( 1 ~250 :デフォルト= 25 ) +  num2 :処理バイト数/12 ( 1 ~ 12 :デフォルト= 4 ) +  num3 :音量の最小値( 0~15 , $40~$A0 :デフォルト= $40 ) +  num4 :音量の最大値( 0~15 , $40~$A0 :デフォルト= $A0 ) + ( $ 又は X を頭に付けると16進数になります) +  常駐時に指定すると、常駐サイズが変化します +  "-S" のみを指定すると現在の状態を表示します + + -Wnum :常駐時にバッファやテーブルを MALLOC で確保します + num :MALLOCで確保するバッファ/テーブルの指定 + ( 1 ~ 31 ,ビット 0 ~ 4 で指定する) + ( $ 又は X を頭に付けると16進数になります) + コマンドラインからの常駐時のみ有効です + 詳細は『“-W”オプションについて』を参照してください + + -Mnum :ADPCMのクロックアップモードを指定 +  (詳細は PCM8AVUP.DOC を参照) + + -Fnum :動作基準周波数を指定 +  (詳細は PCM8AVUP.DOC を参照) + + スイッチに誤りがある場合、ヘルプを表示します。 + + なお、PCM8A が常駐している状態で、PCM8 OFF や PCM8 -R のような、PCM8 に +よる動作中のモード変更や常駐解除の制御が可能になっています。 + ( PCM8 と PCM8A で、制御方法が共通のため、逆も可能です) + + +▲“-W”オプションについて + +  PCM8A をXellent30シリーズのローカルSRAMや16Mバイト以上 + のハイメモリ上で常駐動作させる為に使用します。 + + 1) このオプションはコマンドラインからの常駐時にのみ有効で、常駐後やデ +   バイスドライバとしての登録時には無視します。 + + 2) -Wnum の形式で指定し、num の ビット0~4 の5ビットにより MALLOC で +   確保するバッファ/テーブルを選択できます。 +    各ビットが対応するバッファ/テーブルは次の通りです。 + +   ┌───┬──────────┬──────────┬──┬──┐ +   │ビット│バッファ/テーブル名│ 使用するバイト数 │CPU │DMAC│ +   ├───┼──────────┼──────────┼──┼──┤ +   │ 0 │ PCMバッファ    │ 処理バイト数*16 │R/W │ - │ +   ├───┼──────────┼──────────┼──┼──┤ +   │ 1 │ ADPCMバッファ   │ 処理バイト数*6   │ WR │ RD │ +   ├───┼──────────┼──────────┼──┼──┤ +   │ 2 │ チャンネルバッファ │ 全チャンネル数*128 │R/W │ - │ +   ├───┼──────────┼──────────┼──┼──┤ +   │ 3 │ PCM→ADPCMテーブル │ 103168 (64K+768*49)│ RD │ - │ +   ├───┼──────────┼──────────┼──┼──┤ +   │ 4 │ ADPCM→PCMテーブル │ (音量設定数+97)*1K │ RD │ - │ +   └───┴──────────┴──────────┴──┴──┘ +    CPU/DMACの欄は、割り込み処理中に各領域に対して行われるアクセスの種 +   類です。(RD:読み出しのみ,WR:書き込みのみ,R/W:読み出しと書き込み) +    なお、ビット4のADPCM→PCMテーブルは配置が1Kバイトを単位としてい +   るため、使用バイト数が最悪1Kバイト程度大きくなる場合があります。 +    また、その他のバッファやテーブルも16バイトを単位としています。 +   ( MALLOC は16バイトを単位としているので、バイト数が大きくなること +   はありません) +    なお、使用するバイト数は、今後のバージョンアップに伴い変化する可能 +   性があります。 + +    PCM8A をXellent30シリーズのローカルSRAM上や16MB以 +   上のハイメモリ領域で常駐動作させる場合、ADPCMバッファ を必ず MALLOC +   で確保する領域に設定する必要があります。 + +      例:loadhigh pcm8a -w18 + +    上の例では、18 は2進数では %10010 になるので、ビット1に対応する +   ADPCMバッファ とビット4の ADPCM→PCMテーブル をメインメモリに設定す +   る指定になります。 + + 3) このオプションで指定されなかった領域は、プログラムの後ろに続けて確 +   保します。 + + +▲注意事項/その他 + + 1) 処理簡略化により多少の演算誤差を発生してしまい、音質の低下、定位の +   変化時のノイズ発生、大音量出力時の歪みの増加など、様々な副作用が発生 +   しています。 + +    音質を重視する場合、PCM8 又は MPCM を使用してください。 + + + 2) PCM8Aはバージョン 1.00以降、MPCM の機能を取り込んだことから、 +   従来の音程変換処理の一部を汎用のルーチンで行うようになったため、速度 +   が低下する場合があります。 + +    そのため、68000の搭載機種で、音程変換機能を使用しない場合、 +   バージョン 0.xxを使用することをお勧めします。 + + + 3) 特にMPCMモードを使用すると、CPUにかなりの負担をかけます。 +    このため、68000の搭載機種では、MPCMモードが実質使用不可能 +   に近くなります。 +    そこで、動作を少しでも軽くする方法を紹介します。 + +   (1) -Sオプションで処理バイト数を増やす +     割り込み1回分の処理バイト数を増やしてやる事で、多少の負荷を軽減 +    できますが、音楽のテンポの乱れが起きやすくなります。 + +      例)PCM8A -S,6 (デフォルトは -S,4) + +     6の部分は最大12まで指定できますが、効果は僅かです。 + +   (2) -Fオプションで出力周波数を下げる +     ADPCMの動作周波数を下げることで、データの処理量を減らせます +    が、音質の低下が激しくなります。 +     ただし、ADPCMの負荷はあまり下がりません。 + +      例)PCM8A -F7 (デフォルトは -F0) + +     7の部分は4~6も指定できますが、4まで下げると音質は最悪です。 + +   (3) -Sオプションで動作チャンネル数を減らす +     動作しているチャンネルを止めれば軽くなるのは当然ですが、動作して +    いないチャンネルを削るだけでも、少しは負荷を減らすことができます。 + +      例)PCM8A -S16 (デフォルトは -S25) + +   (4) -Vオプションで音量を原音に固定する +     音量変換を行わないようにすることで、16ビットPCMの負荷を減ら +    すことができますが、ADPCMの負荷は変わりません。 + +      例)PCM8A -V0 (デフォルトは -V1) + + + 4) “-S”オプションは常駐時に指定するだけでなく、常駐後にも指定でき +   ますが、常駐時に指定した値よりワークエリアが広く必要になる指定を、常 +   駐後に指定することはできません。 + +    ワークエリアが広く必要になるのは以下の場合です。 +     (1) 全チャンネル数を増やす場合 +     (2) 処理バイト数を増やす場合 +     (3) 音量の最小値を小さくした場合 +     (4) 音量の最大値を大きくした場合 + +    なお、“-S”オプションを指定せずに常駐させた場合は特別に、ワーク +   エリアが確保されるサイズとデフォルトの設定とが異なり、以下のようにな +   ります。 +     (1) 全チャンネル数= 32(デフォルト= 25 ) +     (2) 処理バイト数 = 144(デフォルト= 48 ) +     (3) 音量の最小値 = $40(デフォルト= $40 ) +     (4) 音量の最大値 = $A0(デフォルト= $A0 ) + +    つまり、-S32,12,$40,$A0 と指定して常駐した後に、-S25,4,$40,$A0 と +   指定した場合と同じになります。 + +    また、常駐時の全チャンネル数は 25 未満にはできません。 + + + 5) デバイスドライバとして組み込んだ場合、-R で組み込みを解除しても、 +   メモリ上にはPCM8Aの本体が残っています。 + +    そして、PCM8Aを再び組み込む場合、デバイスドライバ名( PCM 又 +   は @PCM )を元に、デバイスドライバとして組み込まれたPCM8Aを、メ +   モリ上から探して有効にします。 + +    なお、この時の動作モードは組み込み解除前の状態が保持されています。 + + + 6) 10MHzの機種においてPCM8Aとラスター割り込みを併用すると、 +   CPUに負担がかかり過ぎ、PCM8Aの動作が不安定になったり、他のプ +   ログラムの動作に悪影響を及ぼす恐れがあるので、併用は避けたほうが無難 +   です。 +    また、多数の割り込みが同時に発生した場合などに、ラスター割り込みが +   失敗する可能性もあります。 + + + 7) プログラム作成の際にはバグ混入の無いよう心掛けていますが、本プログ +   ラムの使用に起因する、損害に関する責任は負いかねます。 + +    特に本プログラムの動作はハードウェアに密着しているため、使用者の環 +   境に大きく左右され、作者の環境下では絶対に発生しない不都合や、ソフト +   ウェア的に回避できない不都合が発生する可能性があることを、予め御了承 +   願います。 + +    ちなみに、本プログラムは X68000(無印)+増設3M 及び X68030+増設8M で +   開発と動作確認を行っています。 + + + 8) 本プログラムとソースリスト及びドキュメントはフリーウェアとします。 + +    配布の制限はありません。連絡も不要です。 + +    改変は自由ですが、改変した内容はドキュメント等に明記し、タイトル変 +   更等の手段で、改変したプログラムであることを、利用者が容易に判別でき +   るようにしておいてください。 + +    但し、利用者に不当な利益を及ぼす改変は禁止します。 + + +▲以下のツールをプログラムの作成(とデバッグ)に使用しました + +  X68k High-speed Assembler v2.55 Copyright 1990,91,92 by Y.Nakamura +  X68k High-speed Assembler v3.08 Copyright 1990-94 by Y.Nakamura + +  X68k SILK Hi-Speed Linker v2.27 Copyright 1989-92 SALT +  X68k SILK Hi-Speed Linker v3.01 Copyright 1989-94 SALT + +  X680x0 Screen Editor (ED.R) ver 0.99XI Copyright 1991,92,93 by S.Ueda + +  ソースコードジェネレータ for X680x0 version 2.77 +  Copyright (C) 1989-1992 K.Abe , 1994-1995 R.ShimiZu + +  MEMORYSCOPE for X68000 version 0.03 +  Copyright 1990,1991 Tsune Art Studio/K.Tsuneyoshi(Tsune) + +  < Process launcher > launch.x by Chapuni Nakamura + +  <> SF2.X patch version 1.03 (C)1993 E.Watanabe + +  <> GARO2.X patch version 1.13 (C)1993,94 E.Watanabe + +  <> SP2.X patch version 1.11 (C)1994,95 E.Watanabe +    拙者も助太刀 version 1.05a (C)1994 ずうやん + +  その他 SHARP/Hudson 開発のプログラムの数々 + + + また、本プログラムの動作確認にあたり、数種のFM音源ドライバとそのサポー +トツール、及び数多くの音楽データを使用させていただきました。 + (古いバージョンのものが含まれている場合もあります) + +  X68k MXDRV music driver version 2.06+16 Rel.1 + (c)1988-91 milk.,K.MAEKAWA, Missy.M, Yatsube + +  X68k MDX AUDIO DRIVER version 2.00a HSX/2.06+15/16 (c)1991,92 Konoa. + +  Z-MUSIC UNIVERSAL VERSION 1.52 (C) 1991,1992,1993 ZENJI SOFT +  Z-MUSIC UNIVERSAL VERSION 2.08 (C) 1991,1992,1993,1994 ZENJI SOFT + +  X68k music creative driver version 0.60 (c)1993-95 CUL. + +  MZP [ Multi music data player for Z-MUSIC ] Ver. 1.12b + (C)1991-93 NOVA +  MXtoZ [ MDX data converter for Z-MUSIC ] Ver. 0.43a (C)1991-93 NOVA + +  X68k multi music status display MMDSP.r v0.29 (c)1991-94 Miahmie, Gao + +  SXZC v2.48 Copyright 1991-93 けんと + +  多数のMDXファイル + +  電脳倶楽部掲載のZMSファイル + + + 作成者の方々にこの場を借りてお礼申し上げます。 + + +▲謝辞 + +  本プログラムの、Xellent30シリーズでの動作確認及び不具合の報告 + をしていただいた以下の方々に感謝致します。 + +   E.Watanabe さん , P.E.I. さん + +  本プログラムの、040turboでの不具合報告及び正式対応の実験に協力 + していただいた以下の方に感謝致します。 + +   カップめん さん + +  本プログラムを、ツクモ製16MB増設メモリ(TS-6BE16)上に常駐 + させた場合の不具合報告及びアドバイスをいただいた以下の方に感謝致します。 + +   E.Watanabe さん + + +▲参考文献及び参考としたプログラム + + 1)PCM8.X X68k PCM8 polyphonic PCM driver v0.48 (c)1991,92 H.Etoh + X68k PCM8 polyphonic PCM driver v0.48a (c)1991,92 H.Etoh + X68k PCM8 polyphonic PCM driver v0.48b (c)1991-93 H.Etoh + 及び ドキュメント/テクニカルマニュアル + + 2)江藤 啓:「マルチチャンネルADPCMドライバ PCM8」 +  ソフトバンク株式会社 Oh!X 1992年6月号 + + 3)MPCM.X Modulatable (ad)PCM driver MPCM.x version. 0.45 + copyright (c) 1994,95,96 by wachoman + 及び ドキュメント + + 4)ADPCM4.X M3system/X68000 multi voice ADPCM driver + Copyright (c) 1993 by S.P.S + + 5)X68k-Xellent30 loadhigh.r version 1.21 (C)1995 E.Watanabe + 及び ドキュメント + + 6)E.Watanabe:「Xellent30を抉る! 第1回」 +   株式会社満開製作所 電脳倶楽部 Vol85 + + 7)E.Watanabe:「Xellent30を抉る! 第2回」 +   株式会社満開製作所 電脳倶楽部 Vol86 + + 8)E.Watanabe:「Xellent30を抉る! 第3回」 +   株式会社満開製作所 電脳倶楽部 Vol87 + + 9)E.Watanabe:「Xellent30を抉る! 第4回」 +   株式会社満開製作所 電脳倶楽部 Vol88 + + 10)BEEPs:「X68/040turbo」ソフトバンク株式会社 + + 11)日立データブック1989 +   「6800,68000シリーズ マイクロプロセッサ・周辺LSI」 +    HD63450/HD68450 DMAC + + 12)宍倉幸則:「68000プログラマーズ・ハンドブック」,技術評論社 + + 13)POPCOM編集部・編:「X68000データブック」,小学館 + + +▲最後に + +  本プログラムの作成に当たり参考及び目標となった PCM8.X は、X680x0 + ユーザー必携の優れたソフトウェアであり、今後さらなる発展を遂げることを切 + に願うとともに、ここに故人の多大なる御功績を偲び、心から御冥福申し上げま + す。 + + +(EOF) + \ No newline at end of file diff --git a/src/pcm8a.s b/src/pcm8a.s new file mode 100644 index 0000000..df26e61 --- /dev/null +++ b/src/pcm8a.s @@ -0,0 +1,12880 @@ +* +* X68k polyphonic ADPCM driver PCM8A.X v1.02 *;version +* 音程変換対応(MPCM.X相当) +* Xellent30シリーズ ローカルSRAM用ワーク分離対応 +* 040turbo 対応 , ハイメモリ常駐対応 +* ADPCM clock-up 対応 +* philly 1997/9/2 +* +* 改造は自由ですが、利用者の混乱を防ぐために、 +* 改造内容をドキュメント等に明記しておいてください。 + + .include doscall.mac + .include iocscall.mac + +PCMCI1 equ 25 * チャンネル数のデフォルト値 +PCMCI2 equ 32 * 〃 (常駐時の領域確保用) +PCMCIN equ 25 * 〃 最小値 +PCMCIX equ 250 * 〃 最大値 +PCMBI1 equ 48 * 処理バイト数のデフォルト値 +PCMBI2 equ 144 * 〃 (常駐時の領域確保用) +PCMBIX equ 144 * 〃 の指定可能最大値 +PCMIOC equ 9 * IOCS出力チャンネル数のデフォルト + +VOLMN1 equ $40 * 最小音量のデフォルト値 +VOLMN2 equ $40 * 〃 (常駐時の領域確保用) +VOLMX1 equ $A0 * 最大音量のデフォルト値 +VOLMX2 equ $A0 * 〃 (常駐時の領域確保用) +VOLWID equ 48 +VOLCLP equ 79 +VOLOFS equ $80 + +PCM8FL equ $42 * 動作中の$0C32の値 +PCM8OK equ 'PCM8' +PCM8NG equ '@PCM' +MPCMOK equ 'MPCM' +PCMSPC equ $08 * 無音部 +PCMSP1 equ $88 * 停止時 +PCMSP2 equ $88 * 強制停止時 +PCMSP3 equ $00 * 無音部2 +PCMSPN equ 2 * PCMSP2バイト数 +PCMSPR equ 6 * PCMSP3バイト数 +PCMBGN equ 8 * 開始時バイト数 +TRYNUM equ 4 * 過負荷時リトライ回数 +KEPSIZ equ 32 * 占有名長さ +KEPNUM equ 32 * 最大占有数 +CHNSIZ equ $80 * チャンネルバッファサイズ +WKCNT equ 5 * ワークエリア数 +WKSNUM equ $10 * 2^(ワークエリア数-1) +DCOL0 equ $0000 * 動作表示色コード(割り込み終了) +DCOL1 equ $0020 * 〃 (DPCM→ADPCM変換中) +DCOL2 equ $0018 * 〃 (ADPCM→DPCM変換中) +CACHEL equ 16 * キャッシュ1ラインのバイト数 +CACHES equ 4 * 〃 シフト回数 +REPT equ 5 * クロックアップ自動判別の繰り返し回数-1 +WKSIZ equ 1024 + +T1VECT equ $0021 +T2VECT equ $0022 * trap #2 ベクタ番号 + +T1VECA equ $0084 +T2VECA equ $0088 +FM1BBF equ $09DA +ADIOCS equ $0C32 +MPUFLG equ $0CBC +HUTOP equ $6800 +TXTPL0 equ $FFE82200 +DMACH3 equ $FFE840C0 +MFPIMA equ $FFE88013 +MFPIMB equ $FFE88015 +MFPTMC equ $FFE88023 +FMADR equ $FFE90001 +FMDAT equ $FFE90003 +PCMCNT equ $FFE92001 +PCMDAT equ $FFE92003 +PPIPC equ $FFE9A005 +PPICTL equ $FFE9A007 + +************************************************* +* ADPCM → DPCM 変換マクロ * +************************************************* + +AP00: .macro + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + move.l (a3,a2.l),d0 + add.l d0,(a1)+ + move.l (a3),d0 + .endm + +AP01: .macro + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + move.l (a3,a2.l),(a1)+ + move.l (a3),d0 + .endm + +AP10: .macro + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + move.w (a3,a2.l),d0 + add.w 2(a3,a2.l),d0 + add.w d0,(a1)+ + move.l (a3),d0 + .endm + +AP11: .macro + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + move.w (a3,a2.l),d0 + add.w 2(a3,a2.l),d0 + move.w d0,(a1)+ + move.l (a3),d0 + .endm + +AP12: .macro + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + add.w (a3,a2.l),d1 + add.w d1,(a1)+ + move.w 2(a3,a2.l),d1 + move.l (a3),d0 + .endm + +AP13: .macro + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + add.w (a3,a2.l),d1 + move.w d1,(a1)+ + move.w 2(a3,a2.l),d1 + move.l (a3),d0 + .endm + +AP20: .macro + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + move.w (a3,a2.l),d1 + add.w 2(a3,a2.l),d1 + move.l (a3),d0 + .endm + +AP21: .macro + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + add.w (a3,a2.l),d1 + add.w 2(a3,a2.l),d1 + move.l (a3),d0 + .endm + +AP22: .macro + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + add.w (a3,a2.l),d1 + add.w 2(a3,a2.l),d1 + add.w d1,(a1)+ + move.l (a3),d0 + .endm + +AP23: .macro + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + add.w (a3,a2.l),d1 + add.w 2(a3,a2.l),d1 + move.w d1,(a1)+ + move.l (a3),d0 + .endm + +APA0: .macro + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + move.l (a3,a2.l),d0 + move.l d0,d1 + swap d0 + add.w d0,(a1)+ + move.l (a3),d0 + .endm + +APA1: .macro + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + move.w (a3,a2.l),(a1)+ + move.w 2(a3,a2.l),d1 + move.l (a3),d0 + .endm + +APA2: .macro + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + move.l (a3,a2.l),d0 + add.w d0,4(a1) + swap d0 + add.w d0,(a1) + addq.l #8,a1 + move.l (a3),d0 + .endm + +APA3: .macro + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + move.w (a3,a2.l),(a1)+ + move.w d6,(a1)+ + move.w 2(a3,a2.l),(a1)+ + move.w d6,(a1)+ + move.l (a3),d0 + .endm + +************************************************* +* DPCM → ADPCM 変換マクロ * +************************************************* + +PCM2AD .macro + add.w (a1)+,d0 + move.b (a3,d0.w),d2 + adda.w d2,a2 + move.b (a2),d1 + sub.w 256(a2),d0 + adda.w 512(a2),a2 + add.w (a1)+,d0 + move.b (a3,d0.w),d2 + adda.w d2,a2 + or.w (a2),d1 + move.b d1,(a0)+ + sub.w 256(a2),d0 + adda.w 512(a2),a2 + .endm + +************************************************* +* 16/8bit PCM 音量/音程変換マクロ * +************************************************* + +P16A .macro P16A1 + .local P16AA,P16AB,P16AC,P16AX,P16AA0 + .local P16AA1,P16AA2,P16AA3,P16AA4,P16AA5,P16AA6 + .local P16AA7,P16AA8 + .local P16AB1,P16AB2,P16AB3,P16AB4,P16AB5,P16AB6 + .local P16AB7,P16AB8,P16AB9,P16ABA + .local P16AC1,P16AC2,P16AC3,P16AC4,P16AC5,P16AC6 + .local P16AC7,P16AC8,P16AC9,P16ACA + + .dc.w P16AA0-P16AA +P16AA: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P16AB + dbra d3,P16AA1 + jmp (a5) + .dc.w P16AX-P16AA0 +P16AA0: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P16AB + dbra d3,P16AA1 + jmp (a5) +P16AA1: add.w d5,d4 + bcc P16AA3 + subq.w #2,d2 + bcs P16AA4 +P16AA2: move.w (a0)+,d0 + asl.w #P16A1,d0 +P16AA3: add.w d0,(a1)+ + dbra d3,P16AA1 + jmp (a5) +P16AA4: subi.l #$10000,d2 + bcc P16AA2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16AA7 + lea P16AA6(pc),a4 +P16AA5: jmp (a5) + .dc.w P16AX-P16AA6 +P16AA6: subq.l #2,d2 + bcs P16AA5 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0)+,d0 + asl.w #P16A1,d0 + add.w d0,(a1)+ + dbra d3,P16AA1 + jmp (a5) +P16AA7: lea P16AA8(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w P16AX-P16AA8 +P16AA8: subq.l #2,d2 + bcs P16AA5 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0)+,d0 + asl.w #P16A1,d0 + add.w d0,(a1)+ + dbra d3,P16AA1 +P16AX: jmp (a5) + +P16AB: move.l d5,d7 + swap d7 + add.w d7,d7 + movea.w d7,a2 + addq.w #2,d7 + dbra d3,P16AB1 + jmp (a5) +P16AB1: add.w d5,d4 + bcc P16AC1 + sub.w d7,d2 + bcs P16AB3 +P16AB2: move.w (a0),d0 + adda.w d7,a0 + asl.w #P16A1,d0 + add.w d0,(a1)+ + dbra d3,P16AB1 + jmp (a5) +P16AB3: subi.l #$10000,d2 + bcc P16AB2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16AB7 + lea P16AB5(pc),a4 +P16AB4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16AX-P16AB5 +P16AB5: sub.w d1,d2 + bcs P16AB6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + asl.w #P16A1,d0 + add.w d0,(a1)+ + dbra d3,P16AB1 + jmp (a5) +P16AB6: subi.l #$10000,d2 + bcs P16AB4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + asl.w #P16A1,d0 + add.w d0,(a1)+ + dbra d3,P16AB1 + jmp (a5) +P16AB7: lea P16AB9(pc),a4 + addq.l #2,a1 +P16AB8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16AX-P16AB9 +P16AB9: sub.w d1,d2 + bcs P16ABA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + asl.w #P16A1,d0 + add.w d0,(a1)+ + dbra d3,P16AB1 + jmp (a5) +P16ABA: subi.l #$10000,d2 + bcs P16AB8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + asl.w #P16A1,d0 + add.w d0,(a1)+ + dbra d3,P16AB1 + jmp (a5) +P16AC1: sub.w a2,d2 + bcs P16AC3 +P16AC2: move.w (a0),d0 + adda.w a2,a0 + asl.w #P16A1,d0 + add.w d0,(a1)+ + dbra d3,P16AB1 + jmp (a5) +P16AC3: subi.l #$10000,d2 + bcc P16AC2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16AC7 + lea P16AC5(pc),a4 +P16AC4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16AX-P16AC5 +P16AC5: sub.w d1,d2 + bcs P16AC6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + asl.w #P16A1,d0 + add.w d0,(a1)+ + dbra d3,P16AB1 + jmp (a5) +P16AC6: subi.l #$10000,d2 + bcs P16AC4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + asl.w #P16A1,d0 + add.w d0,(a1)+ + dbra d3,P16AB1 + jmp (a5) +P16AC7: lea P16AC9(pc),a4 + addq.l #2,a1 +P16AC8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16AX-P16AC9 +P16AC9: sub.w d1,d2 + bcs P16ACA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + asl.w #P16A1,d0 + add.w d0,(a1)+ + dbra d3,P16AB1 + jmp (a5) +P16ACA: subi.l #$10000,d2 + bcs P16AC8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + asl.w #P16A1,d0 + add.w d0,(a1)+ + dbra d3,P16AB1 + jmp (a5) + + .endm + +*------- +P16B .macro P16B1 + .local P16BA,P16BB,P16BC,P16BX,P16BA0 + .local P16BA1,P16BA2,P16BA3,P16BA4,P16BA5,P16BA6 + .local P16BA7,P16BA8 + .local P16BB1,P16BB2,P16BB3,P16BB4,P16BB5,P16BB6 + .local P16BB7,P16BB8,P16BB9,P16BBA + .local P16BC1,P16BC2,P16BC3,P16BC4,P16BC5,P16BC6 + .local P16BC7,P16BC8,P16BC9,P16BCA + + .dc.w P16BA0-P16BA +P16BA: add.w d3,d3 + moveq #P16B1,d1 + cmpi.l #$10000,d5 + bcc P16BB + dbra d3,P16BA1 + jmp (a5) + .dc.w P16BX-P16BA0 +P16BA0: add.w d3,d3 + moveq #P16B1,d1 + cmpi.l #$10000,d5 + bcc P16BB + dbra d3,P16BA1 + jmp (a5) +P16BA1: add.w d5,d4 + bcc P16BA3 + subq.w #2,d2 + bcs P16BA4 +P16BA2: move.w (a0)+,d0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 +P16BA3: add.w d0,(a1)+ + dbra d3,P16BA1 + jmp (a5) +P16BA4: subi.l #$10000,d2 + bcc P16BA2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16BA7 + lea P16BA6(pc),a4 +P16BA5: jmp (a5) + .dc.w P16BX-P16BA6 +P16BA6: subq.l #2,d2 + bcs P16BA5 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0)+,d0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16BA1 + jmp (a5) +P16BA7: lea P16BA8(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w P16BX-P16BA8 +P16BA8: subq.l #2,d2 + bcs P16BA5 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0)+,d0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16BA1 +P16BX: jmp (a5) + +P16BB: move.l d5,d7 + swap d7 + add.w d7,d7 + movea.w d7,a2 + addq.w #2,d7 + dbra d3,P16BB1 + jmp (a5) +P16BB1: add.w d5,d4 + bcc P16BC1 + sub.w d7,d2 + bcs P16BB3 +P16BB2: move.w (a0),d0 + adda.w d7,a0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16BB1 + jmp (a5) +P16BB3: subi.l #$10000,d2 + bcc P16BB2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16BB7 + lea P16BB5(pc),a4 +P16BB4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16BX-P16BB5 +P16BB5: sub.w d1,d2 + bcs P16BB6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16BB1 + jmp (a5) +P16BB6: subi.l #$10000,d2 + bcs P16BB4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16BB1 + jmp (a5) +P16BB7: lea P16BB5(pc),a4 + addq.l #2,a1 +P16BB8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16BX-P16BB9 +P16BB9: sub.w d1,d2 + bcs P16BBA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16BB1 + jmp (a5) +P16BBA: subi.l #$10000,d2 + bcs P16BB8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16BB1 + jmp (a5) +P16BC1: sub.w a2,d2 + bcs P16BC3 +P16BC2: move.w (a0),d0 + adda.w a2,a0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16BB1 + jmp (a5) +P16BC3: subi.l #$10000,d2 + bcc P16BC2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16BC7 + lea P16BC5(pc),a4 +P16BC4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16BX-P16BC5 +P16BC5: sub.w d1,d2 + bcs P16BC6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16BB1 + jmp (a5) +P16BC6: subi.l #$10000,d2 + bcs P16BC4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16BB1 + jmp (a5) +P16BC7: lea P16BC9(pc),a4 +P16BC8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16BX-P16BC9 +P16BC9: sub.w d1,d2 + bcs P16BCA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16BB1 + jmp (a5) +P16BCA: subi.l #$10000,d2 + bcs P16BC8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16BB1 + jmp (a5) + + .endm + +*------- +P16C .macro P16C1 + .local P16CA,P16CB,P16CC,P16CX,P16CA0 + .local P16CA1,P16CA2,P16CA3,P16CA4,P16CA5,P16CA6 + .local P16CA7,P16CA8 + .local P16CB1,P16CB2,P16CB3,P16CB4,P16CB5,P16CB6 + .local P16CB7,P16CB8,P16CB9,P16CBA + .local P16CC1,P16CC2,P16CC3,P16CC4,P16CC5,P16CC6 + .local P16CC7,P16CC8,P16CC9,P16CCA + + .dc.w P16CA0-P16CA +P16CA: add.w d3,d3 + moveq #P16C1,d1 + cmpi.l #$10000,d5 + bcc P16CB + dbra d3,P16CA1 + jmp (a5) + .dc.w P16CX-P16CA0 +P16CA0: add.w d3,d3 + moveq #P16C1,d1 + cmpi.l #$10000,d5 + bcc P16CB + dbra d3,P16CA1 + jmp (a5) +P16CA1: add.w d5,d4 + bcc P16CA3 + subq.w #2,d2 + bcs P16CA4 +P16CA2: move.w (a0)+,d0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 +P16CA3: add.w d0,(a1)+ + dbra d3,P16CA1 + jmp (a5) +P16CA4: subi.l #$10000,d2 + bcc P16CA2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16CA7 + lea P16CA6(pc),a4 +P16CA5: jmp (a5) + .dc.w P16CX-P16CA6 +P16CA6: subq.l #2,d2 + bcs P16CA5 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0)+,d0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16CA1 + jmp (a5) +P16CA7: lea P16CA8(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w P16CX-P16CA8 +P16CA8: subq.l #2,d2 + bcs P16CA5 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0)+,d0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16CA1 +P16CX: jmp (a5) + +P16CB: move.l d5,d7 + swap d7 + add.w d7,d7 + movea.w d7,a2 + addq.w #2,d7 + dbra d3,P16CB1 + jmp (a5) +P16CB1: add.w d5,d4 + bcc P16CC1 + sub.w d7,d2 + bcs P16CB3 +P16CB2: move.w (a0),d0 + adda.w d7,a0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16CB1 + jmp (a5) +P16CB3: subi.l #$10000,d2 + bcc P16CB2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16CB7 + lea P16CB5(pc),a4 +P16CB4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16CX-P16CB5 +P16CB5: sub.w d1,d2 + bcs P16CB6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16CB1 + jmp (a5) +P16CB6: subi.l #$10000,d2 + bcs P16CB4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16CB1 + jmp (a5) +P16CB7: lea P16CB5(pc),a4 + addq.l #2,a1 +P16CB8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16CX-P16CB9 +P16CB9: sub.w d1,d2 + bcs P16CBA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16CB1 + jmp (a5) +P16CBA: subi.l #$10000,d2 + bcs P16CB8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16CB1 + jmp (a5) +P16CC1: sub.w a2,d2 + bcs P16CC3 +P16CC2: move.w (a0),d0 + adda.w a2,a0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16CB1 + jmp (a5) +P16CC3: subi.l #$10000,d2 + bcc P16CC2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16CC7 + lea P16CC5(pc),a4 +P16CC4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16CX-P16CC5 +P16CC5: sub.w d1,d2 + bcs P16CC6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16CB1 + jmp (a5) +P16CC6: subi.l #$10000,d2 + bcs P16CC4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16CB1 + jmp (a5) +P16CC7: lea P16CC9(pc),a4 + addq.l #2,a1 +P16CC8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16CX-P16CC9 +P16CC9: sub.w d1,d2 + bcs P16CCA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16CB1 + jmp (a5) +P16CCA: subi.l #$10000,d2 + bcs P16CC8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16CB1 + jmp (a5) + + .endm + +*------- +P16D .macro P16D1 + .local P16DA,P16DB,P16DC,P16DX,P16DA0 + .local P16DA1,P16DA2,P16DA3,P16DA4,P16DA5,P16DA6 + .local P16DA7,P16DA8 + .local P16DB1,P16DB2,P16DB3,P16DB4,P16DB5,P16DB6 + .local P16DB7,P16DB8,P16DB9,P16DBA + .local P16DC1,P16DC2,P16DC3,P16DC4,P16DC5,P16DC6 + .local P16DC7,P16DC8,P16DC9,P16DCA + + .dc.w P16DA0-P16DA +P16DA: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P16DB + dbra d3,P16DA1 + jmp (a5) + .dc.w P16DX-P16DA0 +P16DA0: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P16DB + dbra d3,P16DA1 + jmp (a5) +P16DA1: add.w d5,d4 + bcc P16DA3 + subq.w #2,d2 + bcs P16DA4 +P16DA2: move.w (a0)+,d0 + move.w d0,d6 + asr.w #P16D1,d6 + add.w d6,d0 +P16DA3: add.w d0,(a1)+ + dbra d3,P16DA1 + jmp (a5) +P16DA4: subi.l #$10000,d2 + bcc P16DA2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16DA7 + lea P16DA6(pc),a4 +P16DA5: jmp (a5) + .dc.w P16DX-P16DA6 +P16DA6: subq.l #2,d2 + bcs P16DA5 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0)+,d0 + move.w d0,d6 + asr.w #P16D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16DA1 + jmp (a5) +P16DA7: lea P16DA8(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w P16DX-P16DA8 +P16DA8: subq.l #2,d2 + bcs P16DA5 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0)+,d0 + move.w d0,d6 + asr.w #P16D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16DA1 +P16DX: jmp (a5) + +P16DB: move.l d5,d7 + swap d7 + add.w d7,d7 + movea.l d7,a2 + addq.w #2,d7 + dbra d3,P16DB1 + jmp (a5) +P16DB1: add.w d5,d4 + bcc P16DC1 + sub.w d7,d2 + bcs P16DB3 +P16DB2: move.w (a0),d0 + adda.w d7,a0 + move.w d0,d6 + asr.w #P16D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16DB1 + jmp (a5) +P16DB3: subi.l #$10000,d2 + bcc P16DB2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16DB7 + lea P16DB5(pc),a4 +P16DB4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16DX-P16DB5 +P16DB5: sub.w d1,d2 + bcs P16DB6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #P16D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16DB1 + jmp (a5) +P16DB6: subi.l #$10000,d2 + bcs P16DB4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #P16D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16DB1 + jmp (a5) +P16DB7: lea P16DB9(pc),a4 + addq.l #2,a1 +P16DB8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16DX-P16DB9 +P16DB9: sub.w d1,d2 + bcs P16DBA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #P16D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16DB1 + jmp (a5) +P16DBA: subi.l #$10000,d2 + bcs P16DB8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #P16D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16DB1 + jmp (a5) +P16DC1: sub.w a2,d2 + bcs P16DC3 +P16DC2: move.w (a0),d0 + adda.w a2,a0 + move.w d0,d6 + asr.w #P16D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16DB1 + jmp (a5) +P16DC3: subi.l #$10000,d2 + bcc P16DC2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16DC7 + lea P16DC5(pc),a4 +P16DC4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16DX-P16DC5 +P16DC5: sub.w d1,d2 + bcs P16DC6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #P16D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16DB1 + jmp (a5) +P16DC6: subi.l #$10000,d2 + bcs P16DC4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #P16D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16DB1 + jmp (a5) +P16DC7: lea P16DC9(pc),a4 + addq.l #2,a1 +P16DC8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16DX-P16DC9 +P16DC9: sub.w d1,d2 + bcs P16DCA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #P16D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16DB1 + jmp (a5) +P16DCA: subi.l #$10000,d2 + bcs P16DC8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #P16D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16DB1 + jmp (a5) + + .endm + +*------- +P16E .macro P16E1 + .local P16EA,P16EB,P16EC,P16EX,P16EA0 + .local P16EA1,P16EA2,P16EA3,P16EA4,P16EA5,P16EA6 + .local P16EA7,P16EA8 + .local P16EB1,P16EB2,P16EB3,P16EB4,P16EB5,P16EB6 + .local P16EB7,P16EB8,P16EB9,P16EBA + .local P16EC1,P16EC2,P16EC3,P16EC4,P16EC5,P16EC6 + .local P16EC7,P16EC8,P16EC9,P16ECA + + .dc.w P16EA0-P16EA +P16EA: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P16EB + dbra d3,P16EA1 + jmp (a5) + .dc.w P16EX-P16EA0 +P16EA0: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P16EB + dbra d3,P16EA1 + jmp (a5) +P16EA1: add.w d5,d4 + bcc P16EA3 + subq.w #2,d2 + bcs P16EA4 +P16EA2: move.w (a0)+,d0 + asr.w #P16E1,d0 +P16EA3: add.w d0,(a1)+ + dbra d3,P16EA1 + jmp (a5) +P16EA4: subi.l #$10000,d2 + bcc P16EA2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16EA7 + lea P16EA6(pc),a4 +P16EA5: jmp (a5) + .dc.w P16EX-P16EA6 +P16EA6: subq.l #2,d2 + bcs P16EA5 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0)+,d0 + asr.w #P16E1,d0 + add.w d0,(a1)+ + dbra d3,P16EA1 + jmp (a5) +P16EA7: lea P16EA8(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w P16EX-P16EA8 +P16EA8: subq.l #2,d2 + bcs P16EA5 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0)+,d0 + asr.w #P16E1,d0 + add.w d0,(a1)+ + dbra d3,P16EA1 +P16EX: jmp (a5) + +P16EB: move.l d5,d7 + swap d7 + add.w d7,d7 + movea.l d7,a2 + addq.w #2,d7 + dbra d3,P16EB1 + jmp (a5) +P16EB1: add.w d5,d4 + bcc P16EC1 + sub.w d7,d2 + bcs P16EB3 +P16EB2: move.w (a0),d0 + adda.w d7,a0 + asr.w #P16E1,d0 + add.w d0,(a1)+ + dbra d3,P16EB1 + jmp (a5) +P16EB3: subi.l #$10000,d2 + bcc P16EB2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16EB7 + lea P16EB5(pc),a4 +P16EB4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16EX-P16EB5 +P16EB5: sub.w d1,d2 + bcs P16EB6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + asr.w #P16E1,d0 + add.w d0,(a1)+ + dbra d3,P16EB1 + jmp (a5) +P16EB6: subi.l #$10000,d2 + bcs P16EB4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + asr.w #P16E1,d0 + add.w d0,(a1)+ + dbra d3,P16EB1 + jmp (a5) +P16EB7: lea P16EB9(pc),a4 + addq.l #2,a1 +P16EB8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16EX-P16EB9 +P16EB9: sub.w d1,d2 + bcs P16EBA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + asr.w #P16E1,d0 + add.w d0,(a1)+ + dbra d3,P16EB1 + jmp (a5) +P16EBA: subi.l #$10000,d2 + bcs P16EB8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + asr.w #P16E1,d0 + add.w d0,(a1)+ + dbra d3,P16EB1 + jmp (a5) +P16EC1: sub.w a2,d2 + bcs P16EC3 +P16EC2: move.w (a0),d0 + adda.w a2,a0 + asr.w #P16E1,d0 + add.w d0,(a1)+ + dbra d3,P16EB1 + jmp (a5) +P16EC3: subi.l #$10000,d2 + bcc P16EC2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16EC7 + lea P16EC5(pc),a4 +P16EC4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16EX-P16EC5 +P16EC5: sub.w d1,d2 + bcs P16EC6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + asr.w #P16E1,d0 + add.w d0,(a1)+ + dbra d3,P16EB1 + jmp (a5) +P16EC6: subi.l #$10000,d2 + bcs P16EC4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + asr.w #P16E1,d0 + add.w d0,(a1)+ + dbra d3,P16EB1 + jmp (a5) +P16EC7: lea P16EC9(pc),a4 + addq.l #2,a1 +P16EC8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16EX-P16EC9 +P16EC9: sub.w d1,d2 + bcs P16ECA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + asr.w #P16E1,d0 + add.w d0,(a1)+ + dbra d3,P16EB1 + jmp (a5) +P16ECA: subi.l #$10000,d2 + bcs P16EC8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + asr.w #P16E1,d0 + add.w d0,(a1)+ + dbra d3,P16EB1 + jmp (a5) + + .endm + +*------- +P16F .macro P16F1,P16F2 + .local P16FA,P16FB,P16FC,P16FX,P16FA0 + .local P16FA1,P16FA2,P16FA3,P16FA4,P16FA5,P16FA6 + .local P16FA7,P16FA8 + .local P16FB1,P16FB2,P16FB3,P16FB4,P16FB5,P16FB6 + .local P16FB7,P16FB8,P16FB9,P16FBA + .local P16FC1,P16FC2,P16FC3,P16FC4,P16FC5,P16FC6 + .local P16FC7,P16FC8,P16FC9,P16FCA + + .dc.w P16FA0-P16FA +P16FA: add.w d3,d3 + moveq #P16F1,d1 + cmpi.l #$10000,d5 + bcc P16FB + dbra d3,P16FA1 + jmp (a5) + .dc.w P16FX-P16FA0 +P16FA0: add.w d3,d3 + moveq #P16F1,d1 + cmpi.l #$10000,d5 + bcc P16FB + dbra d3,P16FA1 + jmp (a5) +P16FA1: add.w d5,d4 + bcc P16FA3 + subq.w #2,d2 + bcs P16FA4 +P16FA2: move.w (a0)+,d0 + asr.w d1,d0 + move.w d0,d6 + asr.w #P16F2,d6 + add.w d6,d0 +P16FA3: add.w d0,(a1)+ + dbra d3,P16FA1 + jmp (a5) +P16FA4: subi.l #$10000,d2 + bcc P16FA2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16FA7 + lea P16FA6(pc),a4 +P16FA5: jmp (a5) + .dc.w P16FX-P16FA6 +P16FA6: subq.l #2,d2 + bcs P16FA5 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0)+,d0 + asr.w d1,d0 + move.w d0,d6 + asr.w #P16F2,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16FA1 + jmp (a5) +P16FA7: lea P16FA8(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w P16FX-P16FA8 +P16FA8: subq.l #2,d2 + bcs P16FA5 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0)+,d0 + asr.w d1,d0 + move.w d0,d6 + asr.w #P16F2,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16FA1 +P16FX: jmp (a5) + +P16FB: move.l d5,d7 + swap d7 + add.w d7,d7 + movea.l d7,a2 + addq.w #2,d7 + dbra d3,P16FB1 + jmp (a5) +P16FB1: add.w d5,d4 + bcc P16FC1 + sub.w d7,d2 + bcs P16FB3 +P16FB2: move.w (a0),d0 + adda.w d7,a0 + asr.w d1,d0 + move.w d0,d6 + asr.w #P16F2,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16FB1 + jmp (a5) +P16FB3: subi.l #$10000,d2 + bcc P16FB2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16FB7 + lea P16FB5(pc),a4 +P16FB4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16FX-P16FB5 +P16FB5: sub.w d1,d2 + bcs P16FB6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16F1,d1 + asr.w d1,d0 + move.w d0,d6 + asr.w #P16F2,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16FB1 + jmp (a5) +P16FB6: subi.l #$10000,d2 + bcs P16FB4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16F1,d1 + asr.w d1,d0 + move.w d0,d6 + asr.w #P16F2,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16FB1 + jmp (a5) +P16FB7: lea P16FB9(pc),a4 + addq.l #2,a1 +P16FB8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16FX-P16FB9 +P16FB9: sub.w d1,d2 + bcs P16FBA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16F1,d1 + asr.w d1,d0 + move.w d0,d6 + asr.w #P16F2,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16FB1 + jmp (a5) +P16FBA: subi.l #$10000,d2 + bcs P16FB8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16F1,d1 + asr.w d1,d0 + move.w d0,d6 + asr.w #P16F2,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16FB1 + jmp (a5) +P16FC1: sub.w a2,d2 + bcs P16FC3 +P16FC2: move.w (a0),d0 + adda.w a2,a0 + asr.w d1,d0 + move.w d0,d6 + asr.w #P16F2,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16FB1 + jmp (a5) +P16FC3: subi.l #$10000,d2 + bcc P16FC2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16FC7 + lea P16FC5(pc),a4 +P16FC4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16FX-P16FC5 +P16FC5: sub.w d1,d2 + bcs P16FC6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16F1,d1 + asr.w d1,d0 + move.w d0,d6 + asr.w #P16F2,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16FB1 + jmp (a5) +P16FC6: subi.l #$10000,d2 + bcs P16FC4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16F1,d1 + asr.w d1,d0 + move.w d0,d6 + asr.w #P16F2,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16FB1 + jmp (a5) +P16FC7: lea P16FC5(pc),a4 + addq.l #2,a1 +P16FC8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16FX-P16FC9 +P16FC9: sub.w d1,d2 + bcs P16FCA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16F1,d1 + asr.w d1,d0 + move.w d0,d6 + asr.w #P16F2,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16FB1 + jmp (a5) +P16FCA: subi.l #$10000,d2 + bcs P16FC8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + moveq #P16F1,d1 + asr.w d1,d0 + move.w d0,d6 + asr.w #P16F2,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P16FB1 + jmp (a5) + + .endm + +*------- +PC8A .macro PC8A1 + .local PC8AA,PC8AB,PC8AC,PC8AX,PC8AA0 + .local PC8AA1,PC8AA2,PC8AA3,PC8AA4,PC8AA5,PC8AA6 + .local PC8AA7,PC8AA8 + .local PC8AB1,PC8AB2,PC8AB3,PC8AB4,PC8AB5,PC8AB6 + .local PC8AB7,PC8AB8,PC8AB9,PC8ABA + .local PC8AC1,PC8AC2,PC8AC3,PC8AC4,PC8AC5,PC8AC6 + .local PC8AC7,PC8AC8,PC8AC9,PC8ACA + + .dc.w PC8AA0-PC8AA +PC8AA: add.w d3,d3 + cmpi.l #$10000,d5 + bcc PC8AB + dbra d3,PC8AA1 + jmp (a5) + .dc.w PC8AX-PC8AA0 +PC8AA0: add.w d3,d3 + cmpi.l #$10000,d5 + bcc PC8AB + dbra d3,PC8AA1 + jmp (a5) +PC8AA1: add.w d5,d4 + bcc PC8AA3 + subq.w #1,d2 + bcs PC8AA4 +PC8AA2: move.b (a0)+,d0 + ext.w d0 + asl.w #PC8A1,d0 +PC8AA3: add.w d0,(a1)+ + dbra d3,PC8AA1 + jmp (a5) +PC8AA4: subi.l #$10000,d2 + bcc PC8AA2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8AA7 + lea PC8AA6(pc),a4 +PC8AA5: jmp (a5) + .dc.w PC8AX-PC8AA6 +PC8AA6: subq.l #1,d2 + bcs PC8AA5 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0)+,d0 + ext.w d0 + asl.w #PC8A1,d0 + add.w d0,(a1)+ + dbra d3,PC8AA1 + jmp (a5) +PC8AA7: lea PC8AA8(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w PC8AX-PC8AA8 +PC8AA8: subq.l #1,d2 + bcs PC8AA5 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0)+,d0 + ext.w d0 + asl.w #PC8A1,d0 + add.w d0,(a1)+ + dbra d3,PC8AA1 +PC8AX: jmp (a5) + +PC8AB: move.l d5,d7 + swap d7 + movea.w d7,a2 + addq.w #1,d7 + dbra d3,PC8AB1 + jmp (a5) +PC8AB1: add.w d5,d4 + bcc PC8AC1 + sub.w d7,d2 + bcs PC8AB3 +PC8AB2: move.b (a0),d0 + ext.w d0 + adda.w d7,a0 + asl.w #PC8A1,d0 + add.w d0,(a1)+ + dbra d3,PC8AB1 + jmp (a5) +PC8AB3: subi.l #$10000,d2 + bcc PC8AB2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8AB7 + lea PC8AB5(pc),a4 +PC8AB4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8AX-PC8AB5 +PC8AB5: sub.w d1,d2 + bcs PC8AB6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asl.w #PC8A1,d0 + add.w d0,(a1)+ + dbra d3,PC8AB1 + jmp (a5) +PC8AB6: subi.l #$10000,d2 + bcs PC8AB4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asl.w #PC8A1,d0 + add.w d0,(a1)+ + dbra d3,PC8AB1 + jmp (a5) +PC8AB7: lea PC8AB9(pc),a4 + addq.l #2,a1 +PC8AB8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8AX-PC8AB9 +PC8AB9: sub.w d1,d2 + bcs PC8ABA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asl.w #PC8A1,d0 + add.w d0,(a1)+ + dbra d3,PC8AB1 + jmp (a5) +PC8ABA: subi.l #$10000,d2 + bcs PC8AB8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asl.w #PC8A1,d0 + add.w d0,(a1)+ + dbra d3,PC8AB1 + jmp (a5) +PC8AC1: sub.w a2,d2 + bcs PC8AC3 +PC8AC2: move.b (a0),d0 + ext.w d0 + adda.w a2,a0 + asl.w #PC8A1,d0 + add.w d0,(a1)+ + dbra d3,PC8AB1 + jmp (a5) +PC8AC3: subi.l #$10000,d2 + bcc PC8AC2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8AC7 + lea PC8AC5(pc),a4 +PC8AC4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8AX-PC8AC5 +PC8AC5: sub.w d1,d2 + bcs PC8AC6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asl.w #PC8A1,d0 + add.w d0,(a1)+ + dbra d3,PC8AB1 + jmp (a5) +PC8AC6: subi.l #$10000,d2 + bcs PC8AC4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asl.w #PC8A1,d0 + add.w d0,(a1)+ + dbra d3,PC8AB1 + jmp (a5) +PC8AC7: lea PC8AC9(pc),a4 + addq.l #2,a1 +PC8AC8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8AX-PC8AC9 +PC8AC9: sub.w d1,d2 + bcs PC8ACA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asl.w #PC8A1,d0 + add.w d0,(a1)+ + dbra d3,PC8AB1 + jmp (a5) +PC8ACA: subi.l #$10000,d2 + bcs PC8AC8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asl.w #PC8A1,d0 + add.w d0,(a1)+ + dbra d3,PC8AB1 + jmp (a5) + + .endm + +*------- +PC8B .macro PC8B1 + .local PC8BA,PC8BB,PC8BC,PC8BX,PC8BA0 + .local PC8BA1,PC8BA2,PC8BA3,PC8BA4,PC8BA5,PC8BA6 + .local PC8BA7,PC8BA8 + .local PC8BB1,PC8BB2,PC8BB3,PC8BB4,PC8BB5,PC8BB6 + .local PC8BB7,PC8BB8,PC8BB9,PC8BBA + .local PC8BC1,PC8BC2,PC8BC3,PC8BC4,PC8BC5,PC8BC6 + .local PC8BC7,PC8BC8,PC8BC9,PC8BCA + + .dc.w PC8BA0-PC8BA +PC8BA: add.w d3,d3 + moveq #PC8B1,d1 + cmpi.l #$10000,d5 + bcc PC8BB + dbra d3,PC8BA1 + jmp (a5) + .dc.w PC8BX-PC8BA0 +PC8BA0: add.w d3,d3 + moveq #PC8B1,d1 + cmpi.l #$10000,d5 + bcc PC8BB + dbra d3,PC8BA1 + jmp (a5) +PC8BA1: add.w d5,d4 + bcc PC8BA3 + subq.w #1,d2 + bcs PC8BA4 +PC8BA2: move.b (a0)+,d0 + ext.w d0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 +PC8BA3: add.w d0,(a1)+ + dbra d3,PC8BA1 + jmp (a5) +PC8BA4: subi.l #$10000,d2 + bcc PC8BA2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8BA7 + lea PC8BA6(pc),a4 +PC8BA5: jmp (a5) + .dc.w PC8BX-PC8BA6 +PC8BA6: subq.l #1,d2 + bcs PC8BA5 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0)+,d0 + ext.w d0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8BA1 + jmp (a5) +PC8BA7: lea PC8BA8(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w PC8BX-PC8BA8 +PC8BA8: subq.l #1,d2 + bcs PC8BA5 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0)+,d0 + ext.w d0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8BA1 +PC8BX: jmp (a5) + +PC8BB: move.l d5,d7 + swap d7 + movea.w d7,a2 + addq.w #1,d7 + dbra d3,PC8BB1 + jmp (a5) +PC8BB1: add.w d5,d4 + bcc PC8BC1 + sub.w d7,d2 + bcs PC8BB3 +PC8BB2: move.b (a0),d0 + ext.w d0 + adda.w d7,a0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8BB1 + jmp (a5) +PC8BB3: subi.l #$10000,d2 + bcc PC8BB2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8BB7 + lea PC8BB5(pc),a4 +PC8BB4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8BX-PC8BB5 +PC8BB5: sub.w d1,d2 + bcs PC8BB6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8BB1 + jmp (a5) +PC8BB6: subi.l #$10000,d2 + bcs PC8BB4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8BB1 + jmp (a5) +PC8BB7: lea PC8BB9(pc),a4 + addq.l #2,a1 +PC8BB8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8BX-PC8BB9 +PC8BB9: sub.w d1,d2 + bcs PC8BBA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8BB1 + jmp (a5) +PC8BBA: subi.l #$10000,d2 + bcs PC8BB8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8BB1 + jmp (a5) +PC8BC1: sub.w a2,d2 + bcs PC8BC3 +PC8BC2: move.b (a0),d0 + ext.w d0 + adda.w a2,a0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8BB1 + jmp (a5) +PC8BC3: subi.l #$10000,d2 + bcc PC8BC2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8BC7 + lea PC8BC5(pc),a4 +PC8BC4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8BX-PC8BC5 +PC8BC5: sub.w d1,d2 + bcs PC8BC6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8BB1 + jmp (a5) +PC8BC6: subi.l #$10000,d2 + bcs PC8BC4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8BB1 + jmp (a5) +PC8BC7: lea PC8BC9(pc),a4 + addq.l #2,a1 +PC8BC8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8BX-PC8BC9 +PC8BC9: sub.w d1,d2 + bcs PC8BCA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8BB1 + jmp (a5) +PC8BCA: subi.l #$10000,d2 + bcs PC8BC8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8B1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8BB1 + jmp (a5) + + .endm + +*------- +PC8C .macro PC8C1 + .local PC8CA,PC8CB,PC8CC,PC8CX,PC8CA0 + .local PC8CA1,PC8CA2,PC8CA3,PC8CA4,PC8CA5,PC8CA6 + .local PC8CA7,PC8CA8 + .local PC8CB1,PC8CB2,PC8CB3,PC8CB4,PC8CB5,PC8CB6 + .local PC8CB7,PC8CB8,PC8CB9,PC8CBA + .local PC8CC1,PC8CC2,PC8CC3,PC8CC4,PC8CC5,PC8CC6 + .local PC8CC7,PC8CC8,PC8CC9,PC8CCA + + .dc.w PC8CA0-PC8CA +PC8CA: add.w d3,d3 + moveq #PC8C1,d1 + cmpi.l #$10000,d5 + bcc PC8CB + dbra d3,PC8CA1 + jmp (a5) + .dc.w PC8CX-PC8CA0 +PC8CA0: add.w d3,d3 + moveq #PC8C1,d1 + cmpi.l #$10000,d5 + bcc PC8CB + dbra d3,PC8CA1 + jmp (a5) +PC8CA1: add.w d5,d4 + bcc PC8CA3 + subq.w #1,d2 + bcs PC8CA4 +PC8CA2: move.b (a0)+,d0 + ext.w d0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 +PC8CA3: add.w d0,(a1)+ + dbra d3,PC8CA1 + jmp (a5) +PC8CA4: subi.l #$10000,d2 + bcc PC8CA2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8CA7 + lea PC8CA6(pc),a4 +PC8CA5: jmp (a5) + .dc.w PC8CX-PC8CA6 +PC8CA6: subq.l #1,d2 + bcs PC8CA5 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0)+,d0 + ext.w d0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8CA1 + jmp (a5) +PC8CA7: lea PC8CA8(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w PC8CX-PC8CA8 +PC8CA8: subq.l #1,d2 + bcs PC8CA5 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0)+,d0 + ext.w d0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8CA1 +PC8CX: jmp (a5) + +PC8CB: move.l d5,d7 + swap d7 + movea.w d7,a2 + addq.w #1,d7 + dbra d3,PC8CB1 + jmp (a5) +PC8CB1: add.w d5,d4 + bcc PC8CC1 + sub.w d7,d2 + bcs PC8CB3 +PC8CB2: move.b (a0),d0 + ext.w d0 + adda.w d7,a0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8CB1 + jmp (a5) +PC8CB3: subi.l #$10000,d2 + bcc PC8CB2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8CB7 + lea PC8CB5(pc),a4 +PC8CB4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8CX-PC8CB5 +PC8CB5: sub.w d1,d2 + bcs PC8CB6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8CB1 + jmp (a5) +PC8CB6: subi.l #$10000,d2 + bcs PC8CB4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8CB1 + jmp (a5) +PC8CB7: lea PC8CB9(pc),a4 + addq.l #2,a1 +PC8CB8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8CX-PC8CB9 +PC8CB9: sub.w d1,d2 + bcs PC8CBA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8CB1 + jmp (a5) +PC8CBA: subi.l #$10000,d2 + bcs PC8CB8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8CB1 + jmp (a5) +PC8CC1: sub.w a2,d2 + bcs PC8CC3 +PC8CC2: move.b (a0),d0 + ext.w d0 + adda.w a2,a0 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8CB1 + jmp (a5) +PC8CC3: subi.l #$10000,d2 + bcc PC8CC2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8CC7 + lea PC8CC5(pc),a4 +PC8CC4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8CX-PC8CC5 +PC8CC5: sub.w d1,d2 + bcs PC8CC6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8CB1 + jmp (a5) +PC8CC6: subi.l #$10000,d2 + bcs PC8CC4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8CB1 + jmp (a5) +PC8CC7: lea PC8CC9(pc),a4 + addq.l #2,a1 +PC8CC8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8CX-PC8CC9 +PC8CC9: sub.w d1,d2 + bcs PC8CCA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8CB1 + jmp (a5) +PC8CCA: subi.l #$10000,d2 + bcs PC8CC8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + moveq #PC8C1,d1 + asl.w d1,d0 + move.w d0,d6 + add.w d0,d0 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8CB1 + jmp (a5) + + .endm + +*------- +PC8D .macro PC8D1 + .local PC8DA,PC8DB,PC8DC,PC8DX,PC8DA0 + .local PC8DA1,PC8DA2,PC8DA3,PC8DA4,PC8DA5,PC8DA6 + .local PC8DA7,PC8DA8 + .local PC8DB1,PC8DB2,PC8DB3,PC8DB4,PC8DB5,PC8DB6 + .local PC8DB7,PC8DB8,PC8DB9,PC8DBA + .local PC8DC1,PC8DC2,PC8DC3,PC8DC4,PC8DC5,PC8DC6 + .local PC8DC7,PC8DC8,PC8DC9,PC8DCA + + .dc.w PC8DA0-PC8DA +PC8DA: add.w d3,d3 + cmpi.l #$10000,d5 + bcc PC8DB + dbra d3,PC8DA1 + jmp (a5) + .dc.w PC8DX-PC8DA0 +PC8DA0: add.w d3,d3 + cmpi.l #$10000,d5 + bcc PC8DB + dbra d3,PC8DA1 + jmp (a5) +PC8DA1: add.w d5,d4 + bcc PC8DA3 + subq.w #1,d2 + bcs PC8DA4 +PC8DA2: move.b (a0)+,d0 + ext.w d0 + move.w d0,d6 + asr.w #PC8D1,d6 + add.w d6,d0 +PC8DA3: add.w d0,(a1)+ + dbra d3,PC8DA1 + jmp (a5) +PC8DA4: subi.l #$10000,d2 + bcc PC8DA2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8DA7 + lea PC8DA6(pc),a4 +PC8DA5: jmp (a5) + .dc.w PC8DX-PC8DA6 +PC8DA6: subq.l #1,d2 + bcs PC8DA5 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0)+,d0 + ext.w d0 + move.w d0,d6 + asr.w #PC8D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8DA1 + jmp (a5) +PC8DA7: lea PC8DA8(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w PC8DX-PC8DA8 +PC8DA8: subq.l #1,d2 + bcs PC8DA5 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0)+,d0 + ext.w d0 + move.w d0,d6 + asr.w #PC8D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8DA1 +PC8DX: jmp (a5) + +PC8DB: move.l d5,d7 + swap d7 + movea.w d7,a2 + addq.w #1,d7 + dbra d3,PC8DB1 + jmp (a5) +PC8DB1: add.w d5,d4 + bcc PC8DC1 + sub.w d7,d2 + bcs PC8DB3 +PC8DB2: move.b (a0),d0 + ext.w d0 + adda.w d7,a0 + move.w d0,d6 + asr.w #PC8D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8DB1 + jmp (a5) +PC8DB3: subi.l #$10000,d2 + bcc PC8DB2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8DB7 + lea PC8DB5(pc),a4 +PC8DB4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8DX-PC8DB5 +PC8DB5: sub.w d1,d2 + bcs PC8DB6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #PC8D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8DB1 + jmp (a5) +PC8DB6: subi.l #$10000,d2 + bcs PC8DB4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #PC8D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8DB1 + jmp (a5) +PC8DB7: lea PC8DB9(pc),a4 + addq.l #2,a1 +PC8DB8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8DX-PC8DB9 +PC8DB9: sub.w d1,d2 + bcs PC8DBA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #PC8D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8DB1 + jmp (a5) +PC8DBA: subi.l #$10000,d2 + bcs PC8DB8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #PC8D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8DB1 + jmp (a5) +PC8DC1: sub.w a2,d2 + bcs PC8DC3 +PC8DC2: move.b (a0),d0 + ext.w d0 + adda.w a2,a0 + move.w d0,d6 + asr.w #PC8D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8DB1 + jmp (a5) +PC8DC3: subi.l #$10000,d2 + bcc PC8DC2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8DC7 + lea PC8DC5(pc),a4 +PC8DC4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8DX-PC8DC5 +PC8DC5: sub.w d1,d2 + bcs PC8DC6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #PC8D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8DB1 + jmp (a5) +PC8DC6: subi.l #$10000,d2 + bcs PC8DC4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #PC8D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8DB1 + jmp (a5) +PC8DC7: lea PC8DC9(pc),a4 + addq.l #2,a1 +PC8DC8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8DX-PC8DC9 +PC8DC9: sub.w d1,d2 + bcs PC8DCA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #PC8D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8DB1 + jmp (a5) +PC8DCA: subi.l #$10000,d2 + bcs PC8DC8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #PC8D1,d6 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,PC8DB1 + jmp (a5) + + .endm + +*------- +PC8E .macro PC8E1 + .local PC8EA,PC8EB,PC8EC,PC8EX,PC8EA0 + .local PC8EA1,PC8EA2,PC8EA3,PC8EA4,PC8EA5,PC8EA6 + .local PC8EA7,PC8EA8 + .local PC8EB1,PC8EB2,PC8EB3,PC8EB4,PC8EB5,PC8EB6 + .local PC8EB7,PC8EB8,PC8EB9,PC8EBA + .local PC8EC1,PC8EC2,PC8EC3,PC8EC4,PC8EC5,PC8EC6 + .local PC8EC7,PC8EC8,PC8EC9,PC8ECA + + .dc.w PC8EA0-PC8EA +PC8EA: add.w d3,d3 + cmpi.l #$10000,d5 + bcc PC8EB + dbra d3,PC8EA1 + jmp (a5) + .dc.w PC8EX-PC8EA0 +PC8EA0: add.w d3,d3 + cmpi.l #$10000,d5 + bcc PC8EB + dbra d3,PC8EA1 + jmp (a5) +PC8EA1: add.w d5,d4 + bcc PC8EA3 + subq.w #1,d2 + bcs PC8EA4 +PC8EA2: move.b (a0)+,d0 + ext.w d0 + asr.w #PC8E1,d0 +PC8EA3: add.w d0,(a1)+ + dbra d3,PC8EA1 + jmp (a5) +PC8EA4: subi.l #$10000,d2 + bcc PC8EA2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8EA7 + lea PC8EA6(pc),a4 +PC8EA5: jmp (a5) + .dc.w PC8EX-PC8EA6 +PC8EA6: subq.l #1,d2 + bcs PC8EA5 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0)+,d0 + ext.w d0 + asr.w #PC8E1,d0 + add.w d0,(a1)+ + dbra d3,PC8EA1 + jmp (a5) +PC8EA7: lea PC8EA8(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w PC8EX-PC8EA8 +PC8EA8: subq.l #1,d2 + bcs PC8EA5 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0)+,d0 + ext.w d0 + asr.w #PC8E1,d0 + add.w d0,(a1)+ + dbra d3,PC8EA1 +PC8EX: jmp (a5) + +PC8EB: move.l d5,d7 + swap d7 + movea.w d7,a2 + addq.w #1,d7 + dbra d3,PC8EB1 + jmp (a5) +PC8EB1: add.w d5,d4 + bcc PC8EC1 + sub.w d7,d2 + bcs PC8EB3 +PC8EB2: move.b (a0),d0 + ext.w d0 + adda.w d7,a0 + asr.w #PC8E1,d0 + add.w d0,(a1)+ + dbra d3,PC8EB1 + jmp (a5) +PC8EB3: subi.l #$10000,d2 + bcc PC8EB2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8EB7 + lea PC8EB5(pc),a4 +PC8EB4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8EX-PC8EB5 +PC8EB5: sub.w d1,d2 + bcs PC8EB6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asr.w #PC8E1,d0 + add.w d0,(a1)+ + dbra d3,PC8EB1 + jmp (a5) +PC8EB6: subi.l #$10000,d2 + bcs PC8EB4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asr.w #PC8E1,d0 + add.w d0,(a1)+ + dbra d3,PC8EB1 + jmp (a5) +PC8EB7: lea PC8EB9(pc),a4 + addq.l #2,a1 +PC8EB8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8EX-PC8EB9 +PC8EB9: sub.w d1,d2 + bcs PC8EBA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asr.w #PC8E1,d0 + add.w d0,(a1)+ + dbra d3,PC8EB1 + jmp (a5) +PC8EBA: subi.l #$10000,d2 + bcs PC8EB8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asr.w #PC8E1,d0 + add.w d0,(a1)+ + dbra d3,PC8EB1 + jmp (a5) +PC8EC1: sub.w a2,d2 + bcs PC8EC3 +PC8EC2: move.b (a0),d0 + ext.w d0 + adda.w a2,a0 + asr.w #PC8E1,d0 + add.w d0,(a1)+ + dbra d3,PC8EB1 + jmp (a5) +PC8EC3: subi.l #$10000,d2 + bcc PC8EC2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8EC7 + lea PC8EC5(pc),a4 +PC8EC4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8EX-PC8EC5 +PC8EC5: sub.w d1,d2 + bcs PC8EC6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asr.w #PC8E1,d0 + add.w d0,(a1)+ + dbra d3,PC8EB1 + jmp (a5) +PC8EC6: subi.l #$10000,d2 + bcs PC8EC4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asr.w #PC8E1,d0 + add.w d0,(a1)+ + dbra d3,PC8EB1 + jmp (a5) +PC8EC7: lea PC8EC9(pc),a4 + addq.l #2,a1 +PC8EC8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8EX-PC8EC9 +PC8EC9: sub.w d1,d2 + bcs PC8ECA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asr.w #PC8E1,d0 + add.w d0,(a1)+ + dbra d3,PC8EB1 + jmp (a5) +PC8ECA: subi.l #$10000,d2 + bcs PC8EC8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + ext.w d0 + adda.w d1,a0 + asr.w #PC8E1,d0 + add.w d0,(a1)+ + dbra d3,PC8EB1 + jmp (a5) + + .endm + +*------- +PC8F .macro + .local PC8FA,PC8FB,PC8FC,PC8FX,PC8FY,PC8FA0 + .local PC8FA1,PC8FA2,PC8FA3,PC8FA4,PC8FA5,PC8FA6 + .local PC8FA7,PC8FA8 + .local PC8FB1,PC8FB2,PC8FB3,PC8FB4,PC8FB5,PC8FB6 + .local PC8FB7,PC8FB8,PC8FB9,PC8FBA + .local PC8FC1,PC8FC2,PC8FC3,PC8FC4,PC8FC5,PC8FC6 + .local PC8FC7,PC8FC8,PC8FC9,PC8FCA + + .dc.w PC8FA0-PC8FA +PC8FA: add.w d3,d3 + lea PC8FY(pc),a2 + cmpi.l #$10000,d5 + bcc PC8FB + dbra d3,PC8FA1 + jmp (a5) + .dc.w PC8FX-PC8FA0 +PC8FA0: add.w d3,d3 + lea PC8FY(pc),a2 + cmpi.l #$10000,d5 + bcc PC8FB + dbra d3,PC8FA1 + jmp (a5) +PC8FA1: add.w d5,d4 + bcc PC8FA3 + subq.w #1,d2 + bcs PC8FA4 +PC8FA2: move.b (a0)+,d6 + move.b (a2,d6.w),d0 + ext.w d0 +PC8FA3: add.w d0,(a1)+ + dbra d3,PC8FA1 + jmp (a5) +PC8FA4: subi.l #$10000,d2 + bcc PC8FA2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8FA7 + lea PC8FA6(pc),a4 +PC8FA5: jmp (a5) + .dc.w PC8FX-PC8FA6 +PC8FA6: subq.l #1,d2 + bcs PC8FA5 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0)+,d6 + move.b (a2,d6.w),d0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,PC8FA1 + jmp (a5) +PC8FA7: lea PC8FA8(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w PC8FX-PC8FA8 +PC8FA8: subq.l #1,d2 + bcs PC8FA5 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0)+,d6 + move.b (a2,d6.w),d0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,PC8FA1 +PC8FX: jmp (a5) + +PC8FB: move.l d5,d7 + swap d7 + movea.w d7,a3 + addq.w #1,d7 + dbra d3,PC8FB1 + jmp (a5) +PC8FB1: add.w d5,d4 + bcc PC8FC1 + sub.w d7,d2 + bcs PC8FB3 +PC8FB2: move.b (a0),d6 + adda.w d7,a0 + move.b (a2,d6.w),d0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,PC8FB1 + jmp (a5) +PC8FB3: subi.l #$10000,d2 + bcc PC8FB2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8FB7 + lea PC8FB5(pc),a4 +PC8FB4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8FX-PC8FB5 +PC8FB5: sub.w d1,d2 + bcs PC8FB6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + subq.w #1,d7 + movea.w d7,a3 + addq.w #1,d7 + move.b (a0),d6 + adda.w d1,a0 + move.b (a2,d6.w),d0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,PC8FB1 + jmp (a5) +PC8FB6: subi.l #$10000,d2 + bcs PC8FB4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + subq.w #1,d7 + movea.w d7,a3 + addq.w #1,d7 + move.b (a0),d6 + adda.w d1,a0 + move.b (a2,d6.w),d0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,PC8FB1 + jmp (a5) +PC8FB7: lea PC8FB9(pc),a4 + addq.l #2,a1 +PC8FB8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8FX-PC8FB9 +PC8FB9: sub.w d1,d2 + bcs PC8FBA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + subq.w #1,d7 + movea.w d7,a3 + addq.w #1,d7 + move.b (a0),d6 + adda.w d1,a0 + move.b (a2,d6.w),d0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,PC8FB1 + jmp (a5) +PC8FBA: subi.l #$10000,d2 + bcs PC8FB8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + subq.w #1,d7 + movea.w d7,a3 + addq.w #1,d7 + move.b (a0),d6 + adda.w d1,a0 + move.b (a2,d6.w),d0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,PC8FB1 + jmp (a5) +PC8FC1: sub.w a3,d2 + bcs PC8FC3 +PC8FC2: move.b (a0),d6 + adda.w a3,a0 + move.b (a2,d6.w),d0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,PC8FB1 + jmp (a5) +PC8FC3: subi.l #$10000,d2 + bcc PC8FC2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs PC8FC7 + lea PC8FC5(pc),a4 +PC8FC4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8FX-PC8FC5 +PC8FC5: sub.w d1,d2 + bcs PC8FC6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + subq.w #1,d7 + movea.w d7,a3 + addq.w #1,d7 + move.b (a0),d6 + adda.w d1,a0 + move.b (a2,d6.w),d0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,PC8FB1 + jmp (a5) +PC8FC6: subi.l #$10000,d2 + bcs PC8FC4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + subq.w #1,d7 + movea.w d7,a3 + addq.w #1,d7 + move.b (a0),d6 + adda.w d1,a0 + move.b (a2,d6.w),d0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,PC8FB1 + jmp (a5) +PC8FC7: lea PC8FC5(pc),a4 + addq.l #2,a1 +PC8FC8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w PC8FX-PC8FC9 +PC8FC9: sub.w d1,d2 + bcs PC8FCA + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + subq.w #1,d7 + movea.w d7,a3 + addq.w #1,d7 + move.b (a0),d6 + adda.w d1,a0 + move.b (a2,d6.w),d0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,PC8FB1 + jmp (a5) +PC8FCA: subi.l #$10000,d2 + bcs PC8FC8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + subq.w #1,d7 + movea.w d7,a3 + addq.w #1,d7 + move.b (a0),d6 + adda.w d1,a0 + move.b (a2,d6.w),d0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,PC8FB1 + jmp (a5) +PC8FY: + + .endm + +*-------------------------------------------------------------------- +* ここからプログラム本体 +*-------------------------------------------------------------------- +* デバイスドライバヘッダ + +TOPADR: .dc.l -1 * コマンドラインからの常駐ではここに'PCM8/048'と + .dc.w $C020 * trap #2 エントリへの bra 命令を置く + .dc.l ENTSET + .dc.l DEVENT +DEVNAM: .dc.b 'PCM ' * デバイスドライバ名(8文字) + +HEADD1: .dc.b 'PCM8A Header' * PCM8A 認識用データ(12文字) +HEADD2: .dc.l T2KEEP + +ENTWK: .dc.l 0 + +ENTSET: move.l a5,ENTWK + rts + +DEVENT: movem.l d0/a5,-(sp) + movea.l ENTWK(pc),a5 + moveq #0,d0 + move.b 2(a5),d0 + cmpi.b #13,d0 + bcs DEVEN1 + moveq #1,d0 +DEVEN1: add.w d0,d0 + move.w JTBL(pc,d0.w),d0 + jsr JTBL(pc,d0.w) + move.b d0,3(a5) + move.w d0,-(sp) + move.b (sp)+,4(a5) + movem.l (sp)+,d0/a5 + rts + +JTBL: .dc.w DEVINI-JTBL + .dc.w DEVERR-JTBL + .dc.w DEVERR-JTBL + .dc.w DEVCHK-JTBL + .dc.w DEVIN-JTBL + .dc.w DEVNOP-JTBL + .dc.w DEVNOP-JTBL + .dc.w DEVNOP-JTBL + .dc.w DEVOUT-JTBL + .dc.w DEVOUT-JTBL + .dc.w DEVNOP-JTBL + .dc.w DEVERR-JTBL + .dc.w DEVMOD-JTBL + +DEVINI: jmp DEVSET * 実行後 bra DEVERR に書き替えられる + +DEVERR: move.w #$5003,d0 + rts + +DEVIN: movem.l d1-d2/a1,-(sp) + move.l $12(a5),d2 + movea.l $E(a5),a1 + move.w DEVMD(pc),d1 + IOCS _ADPCMINP + bra DEVOU1 + +DEVOUT: movem.l d1-d2/a1,-(sp) + move.l $12(a5),d2 + movea.l $E(a5),a1 + move.w DEVMD(pc),d1 + IOCS _ADPCMOUT +DEVOU1: movem.l (sp)+,d1-d2/a1 + bra DEVNOP + +DEVCHK: move.l a1,-(sp) + IOCS _ADPCMSNS + movea.l $E(a5),a1 + move.b d0,(a1) + bra DEVMO1 + +DEVMOD: move.l a1,-(sp) + movea.l $E(a5),a1 + move.b (a1)+,DEVMD + move.b (a1)+,DEVMD+1 +DEVMO1: movea.l (sp)+,a1 + +DEVNOP: moveq #0,d0 + rts + +DEVMD: .dc.w $0403 + +DEVEND: +*-------------------------------------------------------------------- +* IOCS用エントリ + +IOCS63: moveq #$14,d0 * アレイチェーン入力 + bra IOCSRX + +IOCS65: moveq #$24,d0 * リンクアレイチェーン入力 + bra IOCSRX + +IOCS61: moveq #$04,d0 * 通常入力 +IOCSRX: movem.l d1-d4/a0/a2/a5-a6,-(sp) + lea WK(pc),a6 + bsr T2KILL * PCM8A停止 + move.b d0,ADIOCS.w + move.l d2,d3 + cmpi.b #$10,d0 + bcs IOCSRY + moveq #10,d2 + cmpi.b #$20,d0 + bcc IOCSRY + move.l d3,d2 + add.l d2,d2 + add.l d3,d2 + add.l d2,d2 +IOCSRY: bclr #15,d1 + bne IOCSRZ + bsr TCWAIT * 時間待ち+キャッシュクリア +IOCSRZ: move.w d0,d2 + move.w d1,d0 + lsr.w #8,d0 + bsr FRQSET * 周波数設定 + bne IOCSRR * 設定できない場合エラー + bsr PANSET + bsr PANCNG + move.b d2,ADIOCS.w + lsr.b #4,d2 + lea DMACH3,a5 + move.b IOCSRT(pc,d2.w),d4 + cmpi.b #1,d2 + bcc IOCSR1 + move.l #$FFF0,d1 * 通常入力 + move.l d1,d2 + cmp.l d1,d3 + bhi IOCSR01 + moveq #0,d1 * バイト数≦$FFF0 + move.w sr,-(sp) + ori.w #$0700,sr + sf M1MOD-WK(a6) + move.l d1,M1LEN-WK(a6) + move.b d4,5(a5) + st (a5) + move.w d3,$A(a5) + move.l a1,$C(a5) + bra IOCSRS + +IOCSRR: sf ADIOCS.w + moveq #-1,d0 + bra IOCSR4 + +IOCSRT: .dc.b $B2,$BA,$BE,$BE + +IOCSR01: * バイト数>$FFF0 + sub.l d1,d3 + lea (a1,d1.l),a2 + cmp.l d2,d3 + bhi IOCSR02 + move.l d3,d2 +IOCSR02: + sub.l d2,d3 + lea (a2,d2.l),a0 + move.w sr,-(sp) + ori.w #$0700,sr + sf M1MOD-WK(a6) + move.l d3,M1LEN-WK(a6) + move.l a0,M1ADR-WK(a6) + move.b d4,5(a5) + st (a5) + move.w d1,$A(a5) + move.l a1,$C(a5) + move.w d2,$1A(a5) + move.l a2,$1C(a5) + move.b #$C8,7(a5) + bra IOCSR2 + +IOCSR1: bhi IOCSR11 * アレイチェーン,リンクアレイチェーン + moveq #0,d0 + not.w d0 + cmp.l d0,d3 + bls IOCSR11 + move.l d0,d3 +IOCSR11: + moveq #0,d0 + move.w sr,-(sp) + ori.w #$0700,sr + sf M1MOD-WK(a6) + move.l d0,M1LEN-WK(a6) + move.b d4,5(a5) + st (a5) + move.w d3,$1A(a5) + move.l a1,$1C(a5) +IOCSRS: move.b #$88,7(a5) +IOCSR2: move.b #4,PCMCNT +IOCSRE: move.w (sp)+,sr +IOCSR3: moveq #0,d0 +IOCSR4: movem.l (sp)+,d1-d4/a0/a2/a5-a6 + rts + +IOCS62: movem.l d1/a5-a6,-(sp) * アレイチェーン出力 + swap d1 + move.w #$1108,d1 + bra IOCS1 + +IOCS64: movem.l d1/a5-a6,-(sp) * リンクアレイチェーン出力 + swap d1 + move.w #$1208,d1 + bra IOCS1 + +IOCS60: movem.l d1/a5-a6,-(sp) * 通常出力 + swap d1 + move.w #$1008,d1 +IOCS1: swap d1 + andi.w #$7FFF,d1 + lea WK(pc),a6 + move.b ADIOCS.w,d0 + beq IOCS10 + cmpi.b #PCM8FL,d0 + bne IOCSER +IOCS10: move.w sr,-(sp) + tst.b SYSFLG-WK(a6) + bmi IOCSM + tst.b IOFLG-WK(a6) + beq IOCS12 + move.l d1,-(sp) + movea.l CHNWK-WK(a6),a5 + moveq #-1,d0 + add.w PCMCHN-WK(a6),d0 + moveq #8,d1 +IOCS11: or.b d1,(a5) + lea CHNSIZ(a5),a5 + dbra d0,IOCS11 + move.l (sp)+,d1 +IOCS12: moveq #7,d0 * チャンネルサーチ中のADPCM割り込みを禁止 + and.b (sp),d0 + cmpi.b #3,d0 + bcc IOCS5 + ori.w #$0300,sr +IOCS5: bsr CHNSRC + move.b d0,IOCHNW-WK(a6) + tst.w d0 + bmi IOCSE1 + movea.l CHNWK-WK(a6),a5 + lsl.w #7,d0 + adda.w d0,a5 + bset #5,(a5) + bne IOCS5 + bset #4,(a5) + bsr T2XE10 + bclr #5,(a5) +IOCS4: move.w (sp)+,sr +IOCS2: moveq #0,d0 +IOCS3: movem.l (sp)+,d1/a5-a6 + rts + +IOCSM: tst.b IOCHN-WK(a6) * 単音再生モード + beq IOCSE1 + bsr T2XE10 + bra IOCS4 +IOCSE1: move.w (sp)+,sr +IOCSER: moveq #-1,d0 + bra IOCS3 + +IOCS66: movem.l d1/a5-a6,-(sp) * 動作モードチェック + lea WK(pc),a6 + moveq #0,d0 + move.b ADIOCS.w,d0 + cmpi.b #PCM8FL,d0 + bne IOCS3 + tst.b SYSFLG-WK(a6) + bmi IOCS66M + tst.b SKPFLG-WK(a6) + bne IOCS2 + move.b IOCHNW-WK(a6),d0 + cmp.b PCMCHN+1-WK(a6),d0 + bcc IOCS2 + movea.l CHNWK-WK(a6),a5 + lsl.w #7,d0 + move.b (a5,d0.w),d0 + bmi IOCS2 * チャンネルは停止している + btst #4,d0 + beq IOCS2 * IOCS出力チャンネルではない +IOCS661: + andi.w #3,d0 + lsl.w #4,d0 + ori.w #2,d0 + bra IOCS3 + +IOCS66M: * 単音再生モード + btst #0,(a6) + beq IOCS2 + move.b M1MOD-WK(a6),d0 + bra IOCS661 + +IOCS67: movem.l d1/a5-a6,-(sp) * 動作制御 + lea WK(pc),a6 + cmpi.l #'PCM8',d1 + beq IOCS673 + cmpi.l #'PCMA',d1 + beq IOCS674 + cmpi.l #'MPCM',d1 + beq IOCS679 + btst #2,ADIOCS.w + bne IOCS675 + tst.b SYSFLG-WK(a6) + bmi IOCS675 + move.b IOCHNW-WK(a6),d0 + cmp.b PCMCHN+1-WK(a6),d0 + bcc IOCS2X + movea.l CHNWK-WK(a6),a5 + moveq #-1,d0 + add.w PCMCHN-WK(a6),d0 + subq.b #1,d1 + bcc IOCS671 + tst.b IOFLG-WK(a6) + bne IOCS6702 + move.w sr,-(sp) + moveq #$DC,d1 * チェーン動作終了 +IOCS670: + ori.w #$0700,sr + btst #4,(a5) + beq IOCS6701 + and.b d1,(a5) +IOCS6701: + move.w (sp),sr + lea CHNSIZ(a5),a5 + dbra d0,IOCS670 + addq.l #2,sp + bra IOCS2X + +IOCS6702: * 全チャンネル一時停止解除禁止 + moveq #$8,d1 +IOCS6703: + or.b d1,(a5) + lea CHNSIZ(a5),a5 + dbra d0,IOCS6703 + sf IOFLG-WK(a6) + bra IOCS2X + +IOCS673: + moveq #48,d0 * バージョン情報(PCM8 v0.48) + bra IOCS3X + +IOCS674: + moveq #102,d0 * バージョン情報(PCM8A v1.02) *;version + bra IOCS3X + +IOCS679: + moveq #45,d0 * バージョン情報(MPCM v0.45) + bra IOCS3X + +IOCS675: * 単音再生モード/録音時動作制御 + lea DMACH3+7,a5 + subq.b #1,d1 + bcc IOCS676 + btst #2,ADIOCS.w + bne IOCS678 + bsr T2KIL0 + bra IOCS2X + +IOCS671: + subq.b #1,d1 + bcc IOCS672 + st IOFLG-WK(a6) + move.w sr,d1 +IOCS6711: * 一時停止 + ori.w #$0700,sr + btst #4,(a5) + beq IOCS6712 + tas (a5) +IOCS6712: + move.w d1,sr + lea CHNSIZ(a5),a5 + dbra d0,IOCS6711 +IOCS2X: moveq #0,d0 +IOCS3X: movem.l (sp)+,d1/a5-a6 + rts + +IOCS672: + bhi IOCS2X + move.w sr,-(sp) +IOCS6721: * 一時停止解除 + ori.w #$0700,sr + move.b (a5),d1 + bpl IOCS6722 + btst #4,d1 + beq IOCS6722 + btst #3,d1 + bne IOCS6722 + andi.b #$0F,d1 + ori.b #$50,d1 + move.b d1,(a5) +IOCS6722: + move.w (sp),sr + lea CHNSIZ(a5),a5 + dbra d0,IOCS6721 + addq.l #2,sp + sf IOFLG-WK(a6) + bsr T2XE1X + bra IOCS3X + +IOCS676: + bhi IOCS677 + move.b #$20,(a5) + bra IOCS2X +IOCS677: + move.b #$08,(a5) + bra IOCS2X +IOCS678: + bsr T2KILL + bra IOCS2X + +CHNSRC: movem.l d1-d5/a0-a1,-(sp) * IOCSチャンネルサーチ + moveq #-1,d0 + moveq #0,d1 + move.b IOCHN-WK(a6),d1 + beq CHNSRE + move.w d1,d0 + move.w PCMCHN-WK(a6),d3 + move.w d3,d4 + sub.w d0,d3 + subq.w #1,d0 + subq.w #1,d4 + lsl.w #7,d4 + movea.w d4,a0 + adda.l CHNWK-WK(a6),a0 + btst #4,SYSFLG-WK(a6) + bne CHNSR5 + moveq #-1,d4 + moveq #-1,d5 +CHNSR1: moveq #$A3,d1 + and.b (a0),d1 + bmi CHNSR5 + bne CHNSR4 + move.l $28(a0),d2 * 残りバイト数 + sub.l $1C(a0),d2 + cmp.l d2,d4 + bls CHNSR4 + move.l d2,d4 + move.w d0,d5 +CHNSR4: lea -CHNSIZ(a0),a0 + dbra d0,CHNSR1 + move.w d5,d0 + bmi CHNSRE +CHNSR5: add.b d3,d0 +CHNSRE: movem.l (sp)+,d1-d5/a0-a1 + rts + + .dc.w 0,0,0 * 4バイト境界調整用 *;dummy + +CHKFL2: .dc.b '@PCM/045' * MPCM 認識用 + +*-------------------------------------------------------------------- +* trap #1 エントリ (MPCM サービスルーチン入口) + +T1ENT: movem.l d1-d7/a0-a6,-(sp) + lea WK(pc),a6 + pea T1END(pc) +T1ENT0: cmpi.w #$1000,d0 + bcc T1ENX + move.w #$00FF,d3 + and.w d0,d3 + cmpi.w #$00FF,d3 + beq T1ENT2 + cmpi.w #16,d3 + bcc T1ERR + lsl.w #7,d3 + movea.w d3,a5 + lsr.w #7,d3 + adda.l CHNWK-WK(a6),a5 +T1ENT1: andi.w #$0F00,d0 + lsr.w #7,d0 + move.w T1JTBL(pc,d0.w),d4 + jmp T1JTBL(pc,d4.w) +T1ENT2: movea.l CHNWK-WK(a6),a5 * 全チャンネル処理時 + bra T1ENT1 +T1ERR: moveq #-1,d0 + addq.l #4,sp +T1END: movem.l (sp)+,d1-d7/a0-a6 + rte + +T1JTBL: .dc.w T1X0-T1JTBL * $00xx:KEY ON + .dc.w T1X1-T1JTBL * $01xx:KEY OFF + .dc.w T1X2-T1JTBL * $02xx:データ登録 + .dc.w T1X3-T1JTBL * $03xx:周波数指定 + .dc.w T1X4-T1JTBL * $04xx:音程設定 + .dc.w T1X5-T1JTBL * $05xx:音量設定 + .dc.w T1X6-T1JTBL * $06xx:PAN設定 + .dc.w T1X7-T1JTBL * $07xx:PCM種類設定 + .dc.w T1X8-T1JTBL * $08xx:KEY OFFモード設定 + .dc.w T1ERR-T1JTBL + .dc.w T1ERR-T1JTBL + .dc.w T1ERR-T1JTBL + .dc.w T1ERR-T1JTBL + .dc.w T1ERR-T1JTBL + .dc.w T1ERR-T1JTBL + .dc.w T1ERR-T1JTBL + +T1ENX: cmpi.w #$1400,d0 + bcc T1ENN + move.w #$00FF,d3 + and.w d0,d3 + cmpi.w #$00FF,d3 + beq T1ENX2 + addi.w #16,d3 + cmp.w PCMCMX-WK(a6),d3 + bcc T1ERR + lsl.w #7,d3 + movea.w d3,a5 + lsr.w #7,d3 + adda.l CHNWK-WK(a6),a5 +T1ENX1: andi.w #$0F00,d0 + lsr.w #7,d0 + move.w T1JTBX(pc,d0.w),d4 + jmp T1JTBX(pc,d4.w) +T1ENX2: movea.l CHNWK-WK(a6),a5 + bra T1ENX1 + +T1JTBX: .dc.w T1EX0-T1JTBX * $10xx:効果音再生 + .dc.w T1EX0-T1JTBX * $11xx:アレイチェーン効果音再生 + .dc.w T1EX0-T1JTBX * $12xx:リンクアレイチェーン効果音再生 + .dc.w T1EX3-T1JTBX * $13xx:効果音停止 + +T1ENN: subi.w #$8000,d0 + bcs T1ERR + cmpi.w #7,d0 + bcc T1ERR + add.w d0,d0 + move.w T1JTBN(pc,d0.w),d4 + jmp T1JTBN(pc,d4.w) + +T1JTBN: .dc.w T1EN0-T1JTBN * $8000:MPCM占有 + .dc.w T1EN1-T1JTBN * $8001:MPCM占有解除 + .dc.w T1EN2-T1JTBN * $8002:MPCM初期化 + .dc.w T1EN3-T1JTBN * $8003:MPU/MFPマスク設定 + .dc.w T1ERR-T1JTBN * $8004:動作モード設定 + .dc.w T1EN5-T1JTBN * $8005:音量テーブル設定 + .dc.w T1EN6-T1JTBN * $8006:効果音発声数指定 + +T1EN0: moveq #-2,d4 * $8000:MPCM占有 + move.b (a1),d0 + beq T1ENER + moveq #-3,d4 + moveq #KEPNUM-1,d0 + movea.l KEPBUF-WK(a6),a0 + bra T1EN02 +T1EN01: lea KEPSIZ(a0),a0 +T1EN02: tst.b (a0) + dbeq d0,T1EN01 + bne T1ENER + moveq #KEPSIZ-2,d0 +T1EN03: move.b (a1)+,(a0)+ + dbeq d0,T1EN03 +T1EN04: moveq #0,d4 + move.b d4,(a0) +T1ENER: move.l d4,d0 + rts + +T1EN1: moveq #-2,d4 * $8001:MPCM占有解除 + move.b (a1),d1 + beq T1ENER + moveq #-3,d4 + moveq #KEPNUM-1,d0 + movea.l KEPBUF-WK(a6),a0 + bra T1EN12 +T1EN11: lea $20(a0),a0 +T1EN12: cmp.b (a0),d1 + dbeq d0,T1EN11 + lea 1(a0),a2 + lea 1(a1),a3 + moveq #KEPSIZ-2,d2 + bra T1EN14 +T1EN13: tst.b d3 + beq T1EN04 +T1EN14: move.b (a2)+,d3 + cmp.b (a3)+,d3 + dbne d2,T1EN13 + beq T1EN04 + dbra d0,T1EN11 + move.l d4,d0 + rts + +T1EN2: bsr T2KILL * $8002:MPCM初期化 + moveq #0,d0 + rts + +T1EN3: bsr T2X2 * $8003:MPU/MFPマスク設定 + rts + +T1EN5: moveq #-2,d4 * $8005:音量テーブル設定 + addq.l #1,d1 + cmpi.l #3,d1 + bcc T1ENER + moveq #127,d2 + lea VOLCTB(pc),a0 + tst.b d1 + beq T1EN52 + lea VOLCT1(pc),a1 * -1以外ならデフォルトのテーブル +T1EN51: move.b (a1)+,(a0)+ + dbra d2,T1EN51 + moveq #0,d0 + rts +T1EN52: moveq #-1,d3 +T1EN53: move.w (a1)+,d0 + mulu #355,d0 + add.l #$40,d0 + lsr.l #7,d0 + cmp.w d3,d0 + bcc T1EN54 + moveq #VOLMX2-VOLMN2,d4 + lea VOLCT2(pc),a2 +T1EN54: move.w d0,d3 + bra T1EN56 +T1EN55: addq.l #2,a2 +T1EN56: cmp.w (a2),d0 * 対応する音量をサーチ + dbcs d4,T1EN55 + move.b #VOLMX2-1,d0 + sub.b d4,d0 + move.b d0,(a0)+ + dbra d2,T1EN53 + moveq #0,d0 + rts + +T1EN6: moveq #-2,d4 * $8006:効果音発声数指定 + cmpi.b #9,d1 + bhi T1ENER + moveq #0,d0 + move.b IOCHMX-WK(a6),d0 + cmpi.b #$FF,d0 + bne T1EN61 + move.b IOCHN-WK(a6),d0 +T1EN61: move.b d1,IOCHMX-WK(a6) + rts + +T1EX0: move.b IOCHN-WK(a6),d5 * $10xx,$11xx,$12xx:効果音再生 + beq T1EX0E + cmpi.b #9,d5 + bls T1EX00 + moveq #9,d5 +T1EX00: lsr.w #1,d0 + move.w d0,d6 + subq.b #1,d5 + moveq #0,d4 + cmpi.b #$E0,d3 + bne T1EX01 + bsr T1SCSR + tst.l d0 + bmi T1EX0E + move.b d0,d3 +T1EX01: cmpi.b #$FF,d3 + bne T1EX02 + move.b d5,d4 + moveq #0,d3 +T1EX02: cmp.b d5,d3 + bhi T1EX0E +T1EX03: move.w d6,d0 + bsr T1SOUT + lea CHNSIZ(a5),a5 + dbra d4,T1EX03 + moveq #0,d0 + move.b d3,d0 + rts + +T1EX0E: moveq #-2,d0 + rts + +T1EX3: moveq #0,d2 * $13xx:効果音停止 + cmpi.b #$FF,d3 + bne T1EX31 + moveq #7,d2 +T1EX31: tas (a5) + lea CHNSIZ(a5),a5 + dbra d2,T1EX31 + moveq #0,d0 + rts + +T1SCSR: movem.l d1-d5/a0,-(sp) * 空きチャンネルサーチ + moveq #-2,d0 + moveq #0,d3 + move.b IOCHN-WK(a6),d3 + beq T1SCSE + cmpi.b #9,d3 + bls T1SCS0 + moveq #9,d3 +T1SCS0: subq.w #1,d3 + move.l d3,d0 + moveq #16,d2 + lsl.w #7,d2 + movea.w d2,a0 + adda.l CHNWK-WK(a6),a0 + btst #4,SYSFLG-WK(a6) + bne T1SCS5 + moveq #-1,d4 + moveq #-1,d5 +T1SCS1: moveq #$83,d1 + and.b (a0),d1 + bmi T1SCS5 + bne T1SCS4 + move.l $28(a0),d2 * 残りバイト数 + sub.l $1C(a0),d2 + cmp.l d2,d4 + bls T1SCS4 + move.l d2,d4 + move.w d3,d5 +T1SCS4: lea CHNSIZ(a0),a0 + dbra d3,T1SCS1 + move.w d5,d3 + bmi T1SCSE +T1SCS5: sub.b d3,d0 +T1SCSE: movem.l (sp)+,d1-d5/a0 + rts + +T1SOUT: movem.l d0-d4/a0,-(sp) * 効果音出力 + cmpi.l #01000000,d1 + bcs T1SOUE + swap d1 + moveq #0,d3 + move.b d1,d3 * 音量 + bpl T1SO21 + moveq #$40,d3 +T1SO21: lea VOLCTB(pc),a0 + move.b (a0,d3.w),d1 + ror.w #8,d1 + moveq #3,d3 + and.b d1,d3 + lsl.b #4,d3 + move.b d3,d4 + move.b d0,d1 + rol.w #8,d1 + swap d1 + move.b d1,d3 * PAN + bpl T1SO01 + moveq #1,d3 + cmpi.b #$A0,d1 + bcs T1SO01 + moveq #3,d3 + cmpi.b #$E0,d1 + bcs T1SO01 + moveq #2,d3 +T1SO01: cmpi.b #4,d3 + bcs T1SO02 + move.b 3(a5),d3 +T1SO02: move.b d3,d1 + ror.w #8,d1 + move.b d1,d3 * 周波数 + cmpi.b #7,d3 + bcs T1SO11 + moveq #4,d3 + cmpi.b #$F0,d1 + beq T1SO11 + cmpi.b #$F1,d1 + beq T1SO11 + move.b 2(a5),d3 +T1SO11: and.w #$0007,d3 + or.b d4,d3 + move.b d3,d1 + rol.w #8,d1 + bsr TBLSET +T1SOUE: movem.l (sp)+,d0-d4/a0 + rts + +T1X0: moveq #0,d2 * $00xx:KEY ON + cmpi.b #$FF,d3 + bne T1X01 + moveq #15,d2 +T1X01: bsr T1KONS + lea CHNSIZ(a5),a5 + dbra d2,T1X01 + bsr T2XE1X + moveq #0,d0 + rts + +T1X1: moveq #0,d2 * $01xx:KEY OFF + cmpi.b #$FF,d3 + bne T1X11 + moveq #15,d2 +T1X11: bsr T1KOFS + lea CHNSIZ(a5),a5 + dbra d2,T1X11 + moveq #0,d0 + rts + +T1X2: moveq #0,d2 * $02xx:データ登録 + cmpi.b #$FF,d3 + bne T1X21 + moveq #15,d2 +T1X21: bsr T1CSET + lea CHNSIZ(a5),a5 + dbra d2,T1X21 + rts + +T1X3: moveq #0,d2 * $03xx:周波数指定 + cmpi.b #$FF,d3 + bne T1X31 + moveq #15,d2 +T1X31: bsr T1CFRQ + lea CHNSIZ(a5),a5 + dbra d2,T1X31 + rts + +T1X4: moveq #0,d2 * $04xx:音程設定 + cmpi.b #$FF,d3 + bne T1X41 + moveq #15,d2 +T1X41: bsr T1CNOT + lea CHNSIZ(a5),a5 + dbra d2,T1X41 + rts + +T1X5: moveq #0,d2 * $05xx:音量設定 + cmpi.b #$FF,d3 + bne T1X51 + moveq #15,d2 +T1X51: bsr T1CVOL + lea CHNSIZ(a5),a5 + dbra d2,T1X51 + rts + +T1X6: moveq #0,d2 * $06xx:PAN設定 + cmpi.b #$FF,d3 + bne T1X61 + moveq #15,d2 +T1X61: bsr T1CPAN + lea CHNSIZ(a5),a5 + dbra d2,T1X61 + rts + +T1X7: moveq #0,d2 * $07xx:PCM種類設定 + cmpi.b #$FF,d1 + beq T1X71 + cmpi.b #3,d1 + bcc T1XERR +T1X71: cmpi.b #$FF,d3 + bne T1X72 + moveq #15,d2 +T1X72: moveq #0,d0 + move.b $50(a5),d0 + move.b d1,$50(a5) + bsr T1FCNG + bsr T1VCNG + lea CHNSIZ(a5),a5 + dbra d2,T1X72 + rts + +T1XERR: moveq #-2,d0 + rts + +T1X8: moveq #0,d2 * $08xx:KEY OFFモード設定 + cmpi.b #$FF,d3 + bne T1X81 + moveq #15,d2 +T1X81: moveq #0,d0 + move.b $59(a5),d0 + cmpi.b #$FF,d1 + beq T1X82 + move.b d1,$59(a5) +T1X82: lea CHNSIZ(a5),a5 + dbra d2,T1X81 + rts + +T1KONS: movem.l d0-d2/a0,-(sp) * キーオン + moveq #3,d0 + and.b (a5),d0 + cmpi.b #3,d0 + bne T1KONX + moveq #0,d1 + move.w sr,d2 + ori.w #$0700,sr + ori.b #$40,(a5) + andi.b #$7F,(a5) + move.l d1,8(a5) + move.b d1,$55(a5) + move.w #2,$C(a5) + moveq #3,d0 + and.b $50(a5),d0 + move.b PCMMD2-WK(a6,d0.w),d0 + move.w d0,d1 + move.w 2+PCMMOD-WK(a6,d0.w),$E(a5) + move.l PCMINI-WK(a6,d0.w),$4(a5) + moveq #$38,d0 + add.l a5,d0 + move.l d0,$10(a5) + move.l $30(a5),$1C(a5) + move.l $34(a5),$28(a5) + move.l $48(a5),d0 + beq T1KON1 + subq.l #1,d0 +T1KON1: move.l d0,$4C(a5) + move.w d2,sr +T1KONX: movem.l (sp)+,d0-d2/a0 + rts + +T1KOFS: movem.l d0-d2/a0,-(sp) * キーオフ + tst.b (a5) + bmi T1KOFE + moveq #3,d0 + and.b (a5),d0 + cmpi.b #3,d0 + bne T1KOFE + tst.b $59(a5) + bne T1KOF1 + tas (a5) + bra T1KOFE +T1KOF1: moveq #0,d1 + move.b $50(a5),d0 + bpl T1KOF5 + move.w sr,d2 + ori.w #$0700,sr + move.l $44(a5),d0 + bne T1KOF2 + move.l d1,$4C(a5) + bra T1KOF4 +T1KOF2: ori.b #$40,(a5) + move.l d0,4(a5) + move.l d1,8(a5) + move.b d1,$55(a5) + move.w d1,$C(a5) + lea $40(a5),a0 + move.l a0,$10(a5) + move.l $38(a5),$1C(a5) + move.l $3C(a5),$28(a5) +T1KOF4: move.w d2,sr +T1KOFE: movem.l (sp)+,d0-d2/a0 + rts + +T1KOF5: move.w sr,d2 + ori.w #$0700,sr + ori.b #$40,(a5) + move.w d1,$C(a5) + lea $40(a5),a0 + move.l a0,$10(a5) + move.l $38(a5),$1C(a5) + move.l $3C(a5),$28(a5) + move.w d2,sr + movem.l (sp)+,d0-d2/a0 + +T1CSET: movem.l d1-d7/a0-a3,-(sp) * チャンネルデータセット + ori.b #$C0,(a5) + lea -CHNSIZ(sp),sp + movea.l sp,a3 + moveq #0,d4 + move.b #$C3,(a3) + move.b 1(a5),1(a3) + move.w 2(a5),2(a3) + moveq #0,d0 + move.l d0,8(a3) + move.l d0,$14(a3) + move.l #$00010000,$18(a3) + move.b $58(a5),d0 + cmpi.b #$F0,d0 + bcs T1CSE1 + cmpi.b #$F2,d0 + bcc T1CSE1 + eori.b #$F1,d0 + addq.b #1,d0 + bra T1CSE2 +T1CSE1: move.b (a1),d0 +T1CSE2: tst.b d0 + beq T1CSE4 + cmpi.b #$FF,d0 + beq T1CSE5 + cmpi.b #3,d0 + bcs T1CSE5 +T1CSE4: addq.w #1,d4 +T1CSE5: move.b d0,$50(a3) + move.b d0,d7 + moveq #3,d6 + and.b d0,d6 + move.b PCMMD2-WK(a6,d6.w),d6 + lea DPCMBF(pc),a0 + move.l (a0,d6.w),$20(a3) + move.w #2,$C(a3) + move.w PCMMOD+2-WK(a6,d6.w),$E(a3) + move.l PCMINI-WK(a6,d6.w),$4(a3) + moveq #0,d0 + move.b 1(a1),d0 + bpl T1CSE6 + move.b #$40,d0 +T1CSE6: move.b d0,$51(a3) + move.w $52(a5),$52(a3) + move.b $54(a5),$54(a3) + move.b #0,$55(a3) + move.w #0,$56(a3) + cmpi.b #1,d7 + beq T1CS10 + move.l 4(a1),d0 + move.l 8(a1),d3 + add.l d0,d3 + move.l $C(a1),d1 + add.l d0,d1 + cmp.l d1,d3 + bcc T1CS01 + move.l d3,d1 +T1CS01: move.l $10(a1),d2 + addq.l #1,d2 + add.l d0,d2 + cmp.l d1,d2 + bcc T1CS02 + move.l d1,d2 +T1CS02: cmp.l d2,d3 + bcc T1CS03 + move.l d3,d2 +T1CS03: movem.l d0-d3,$30(a3) + bra T1CS20 +T1CS10: move.l 4(a1),d0 + bclr #0,d0 + beq T1CS11 + addq.w #1,d4 +T1CS11: move.l 8(a1),d3 + bclr #0,d3 + beq T1CS12 + addq.w #1,d4 +T1CS12: add.l d0,d3 + move.l $C(a1),d1 + bclr #0,d1 + beq T1CS13 + addq.w #1,d4 +T1CS13: add.l d0,d1 + cmp.l d1,d3 + bcc T1CS14 + move.l d3,d1 +T1CS14: move.l $10(a1),d2 + addq.l #2,d2 + bclr #0,d2 + beq T1CS15 + addq.w #1,d4 +T1CS15: add.l d0,d2 + cmp.l d1,d2 + bcc T1CS16 + move.l d1,d2 +T1CS16: cmp.l d2,d3 + bcc T1CS17 + move.l d3,d2 +T1CS17: movem.l d0-d3,$30(a3) +T1CS20: moveq #0,d0 + move.l d0,$24(a3) + move.l d0,$40(a3) + move.l d0,$44(a3) + move.l $14(a1),d1 + move.l d1,$48(a3) + beq T1CS21 + subq.l #1,d1 +T1CS21: move.l d1,$4C(a3) + move.l d0,8(a3) + move.l d0,$14(a3) + move.l a5,a1 + movea.l a3,a5 + bsr T1FCNG + bsr T1VCNG + bsr T1KONS + tas (a3) + movea.l a1,a5 + moveq #$38,d0 + add.l a5,d0 + move.l d0,$10(a3) + move.w sr,-(sp) + ori.w #$0700,sr + movem.l (a3),d0-d7/a0-a2 + movem.l d0-d7/a0-a2,(a5) + movem.l 44(a3),d0-d7/a0-a2 + movem.l d0-d7/a0-a2,44(a5) + move.w (sp)+,sr +T1CSEN: lea CHNSIZ(sp),sp + move.l d4,d0 + neg.l d0 + movem.l (sp)+,d1-d7/a0-a3 + rts + +T1CFRQ: moveq #0,d0 * 周波数変更 + move.b $58(a5),d0 + cmpi.b #$FF,d1 + beq T1CRTN + cmpi.b #$F0,d1 + beq T1CFR1 + cmpi.b #$F1,d1 + beq T1CFR1 + cmpi.b #7,d1 + bcc T1CERR +T1CFR1: move.b d1,$58(a5) + bra T1FCNG + +T1CERR: moveq #-2,d0 +T1CRTN: rts + +T1CNOT: moveq #0,d0 * 音程変更 + move.w $52(a5),d0 + cmpi.w #$FFFF,d1 + beq T1CRTN + cmpi.w #128*64,d1 + bcc T1CERR + move.w d1,$52(a5) + +T1FCNG: movem.l d0-d3/a0,-(sp) * 周波数/音程変更 + moveq #0,d0 + move.b $58(a5),d0 + cmpi.b #7,d0 + bcs T1FCN1 + moveq #4,d0 +T1FCN1: add.w d0,d0 + move.w FREQ-WK(a6,d0.w),d0 + moveq #0,d1 + move.b FRQSEL-WK(a6),d1 + add.w d1,d1 + move.w FREQ-WK(a6,d1.w),d1 + moveq #0,d2 + move.w $52(a5),d2 + moveq #0,d3 + move.b $51(a5),d3 + lsl.w #6,d3 + bsr FRQCAL + move.l d0,$18(a5) + move.b $50(a5),d3 + bgt T1FCN3 + lea PCMXTB(pc),a0 +T1FCN2: movem.l (a0)+,d1-d2 + cmp.l d1,d0 + bcs T1FCN2 + move.l d2,$2C(a5) +T1FCN3: movem.l (sp)+,d0-d3/a0 + rts + +T1CVOL: moveq #0,d0 * 音量変更 + move.b $54(a5),d0 + cmpi.b #$FF,d1 + beq T1CRTN + movem.l d1/a0,-(sp) + tst.b d1 + bpl T1CVO1 + move.b #$40,d1 +T1CVO1: move.b d1,$54(a5) + ext.w d1 + lea VOLCTB(pc),a0 + move.b (a0,d1.w),1(a5) + movem.l (sp)+,d1/a0 + +T1VCNG: movem.l d0-d3/a0,-(sp) + moveq #0,d1 + move.b 1(a5),d1 + cmpi.b #$10,d1 + bcc T1VCN1 + move.b PCMXT4-WK(a6,d1.w),d1 +T1VCN1: movem.w VOLMN0-WK(a6),d2-d3 + cmp.b d2,d1 + bcs T1VC11 + cmp.b d3,d1 + bls T1VC12 + move.b d3,d1 + bra T1VC12 +T1VC11: move.b d2,d1 +T1VC12: moveq #6,d2 * 音量固定チェック + and.b SYSFLG-WK(a6),d2 + beq T1VC13 + move.w #$80,d1 +T1VC13: move.b d1,1(a5) + move.b $50(a5),d2 + bgt T1VCN2 + sub.b VOLMIN+1-WK(a6),d1 * ADPCM時 + addi.w #VOLWID+1,d1 + swap d1 + lsr.l #6,d1 + move.l d1,$24(a5) + bra T1VCN5 +T1VCN2: subq.b #1,d2 * PCM時 + bne T1VCN3 + lea PCMXT2(pc),a0 + bra T1VCN4 +T1VCN3: lea PCMXT3(pc),a0 +T1VCN4: subi.b #VOLMN2,d1 + add.w d1,d1 + add.w d1,d1 + move.l (a0,d1.w),$2C(a5) +T1VCN5: movem.l (sp)+,d0-d3/a0 + rts + +T1CPAN: moveq #0,d0 * PAN変更 + move.b 3(a5),d0 + cmpi.b #$7F,d1 + beq T1CRTN + movem.l d1-d2,-(sp) + move.b d1,d2 + beq T1CPA3 + bpl T1CPA1 + moveq #1,d1 + cmpi.b #$A0,d2 + bcs T1CPA1 + moveq #3,d1 + cmpi.b #$E0,d2 + bcs T1CPA1 + moveq #2,d1 +T1CPA1: cmpi.b #4,d1 + bcs T1CPA2 + move.b d0,d1 + cmpi.b #4,d1 + bcs T1CPA2 + moveq #3,d1 +T1CPA2: move.b d1,3(a5) + bsr PANSET + movem.l (sp)+,d1-d2 + rts + +T1CPA3: tas (a5) + movem.l (sp)+,d1-d2 + rts + +T1VCHK: movem.l d1/a0,-(sp) * TRAP #1 ベクタチェック + moveq #0,d1 * 0:常駐可 + lea T1VECA.w,a0 + move.l (a0),a0 + cmpa.l #$00F00000,a0 + bcc T1VCH1 + moveq #5,d1 * 5:常駐禁止 +T1VCH1: move.l a0,d0 + swap d0 + andi.w #$FFF0,d0 + cmpi.w #$21F0,d0 + beq T1VCH2 + moveq #5,d1 +T1VCH2: subq.l #8,a0 + move.l (a0),d0 + cmpi.l #MPCMOK,d0 + beq T1VCH3 + cmpi.l #PCM8NG,d0 + bne T1VCH4 +T1VCH3: moveq #5,d1 * 5:常駐禁止 +T1VCH4: move.l d1,d0 + movem.l (sp)+,d1/a0 + rts + + .dc.w 0,0 * 4バイト境界調整用 *;dummy + +T1KBUF: dcb.b KEPSIZ*KEPNUM,0 * 占有文字列バッファ + + .dc.b 'PCM8A102' * PCM8A 認識用 *;version +CHKFLG: .dc.b '@PCM/048' * PCM8 認識用 + +*-------------------------------------------------------------------- +* trap #2 エントリ (PCM8A サービスルーチン入口) + +T2ENT: movem.l d1-d7/a0-a6,-(sp) + lea WK(pc),a6 + pea T2END(pc) + cmpi.w #$1000,d0 + bcc T2ENTX + cmpi.w #$0100,d0 + bcc T2E3 + moveq #$0F,d3 + and.w d0,d3 +T2ENT21: + cmp.b PCMCHN-WK+1(a6),d3 + bcc T2ERR + lsl.w #7,d3 + movea.w d3,a5 + adda.l CHNWK-WK(a6),a5 + andi.w #$00F0,d0 + lsr.w #3,d0 + move.w T2JTBL(pc,d0.w),d4 + jmp T2JTBL(pc,d4.w) +T2ERR: moveq #-1,d0 + addq.l #4,sp +T2END: movem.l (sp)+,d1-d7/a0-a6 + rte + +T2JTBL: .dc.w T2XE1-T2JTBL * $000x:通常出力 + .dc.w T2XE1-T2JTBL * $001x:アレイチェーン出力 + .dc.w T2XE2-T2JTBL * $002x:リンクアレイチェーン出力 + .dc.w T2ERR-T2JTBL * $003x + .dc.w T2ERR-T2JTBL * $004x + .dc.w T2ERR-T2JTBL * $005x + .dc.w T2ERR-T2JTBL * $006x + .dc.w TBLCNG-T2JTBL * $007x:動作モード変更 + .dc.w TBLCHK-T2JTBL * $008x:データ長問い合わせ + .dc.w TBLMOD-T2JTBL * $009x:動作モード問い合わせ + .dc.w TBLADR-T2JTBL * $00Ax:アクセスアドレス問い合わせ + .dc.w T2STOP-T2JTBL * $00Bx:チャンネル動作中断 + .dc.w T2CONT-T2JTBL * $00Cx:チャンネル動作継続 + .dc.w T2ERR-T2JTBL * $00Dx + .dc.w T2ERR-T2JTBL * $00Ex + .dc.w T2ERR-T2JTBL * $00Fx + +T2ENTX: cmpi.w #$2000,d0 * $1nxx:拡張チャンネル処理(n:コマンド,xx:チャンネル) + bcc T2E4 + moveq #0,d3 + move.b d0,d3 + lsr.w #4,d0 + bra T2ENT21 + +T2E3: beq T2E30 + cmpi.w #$0200,d0 + bcc T2ERR + addi.b #9,d0 + bcs T2ENT8 + cmpi.b #$D,d0 + bhi T2ERR + beq T2ENTB + cmpi.b #$B,d0 + bcs T2ENT6 + beq T2ENT7 +T2ENTA: bsr T2KILL * $0103:PCM8A停止 + moveq #0,d0 + rts + +T2ENTB: bsr T2ACTV * $0104:PCM8A動作 + moveq #0,d0 + rts + +T2ENT6: st SKPFLG-WK(a6) * $0101:一時停止 + moveq #0,d0 + rts + +T2ENT7: sf SKPFLG-WK(a6) * $0102:一時停止解除 + bsr T2XE1X + rts + +T2E30: btst #2,ADIOCS.w * $0100:終了 + bne T2E34 + tst.b SKPFLG-WK(a6) + bne T2E33 + movea.l CHNWK-WK(a6),a4 + moveq #-1,d1 + add.w PCMCHN-WK(a6),d1 + moveq #$FC,d0 * 現在のブロックを出力して終了 +T2E31: and.b d0,(a4) + lea CHNSIZ(a4),a4 + dbra d1,T2E31 + moveq #0,d0 + rts + +T2E33: move.w sr,d2 * 即座に終了 + ori.w #$0700,sr + lea DMACH3,a5 + bsr DMASPX + bsr TBLCLR + move.w d2,sr + bsr DSPCLR + sf SKPFLG-WK(a6) + sf ADIOCS.w + move.b #PCMSP2,PCMDAT + moveq #0,d0 + rts + +T2E34: bsr T2KILL + moveq #0,d0 + rts + +T2E4A: subi.w #$2000,d0 * MPCMコールへの置き換え + bra T1ENT0 + +T2E4: cmpi.w #$4000,d0 * MPCMコール? + bcs T2E4A + tst.w d0 + bpl T2ENT9 + cmpi.w #$A000,d0 + bcs T2ERR1 + cmpi.w #$B000,d0 * MPCMコール? + bcs T2E4A + subi.w #$FFF0,d0 + bcs T2ERR1 + beq T2E5 + cmpi.w #1,d0 + beq T2E51 + cmpi.w #$C,d0 + bcs T2ERR1 + beq T2E45 + cmpi.w #$E,d0 + bcs T2E46 + beq T2E47 + tst.b KEEPFL-WK(a6) * $FFFF:常駐解除 + bne T2ERR1 + moveq #KEPNUM-1,d1 + movea.l KEPBUF-WK(a6),a0 + moveq #0,d0 +T2E41: or.b (a0),d0 + lea 32(a0),a0 + dbne d1,T2E41 + bne T2ERR1 + ori.w #$0700,sr + bsr T2KILL + lea VECTBL-WK(a6),a0 * 元のベクタと同じか? + moveq #-2,d2 +T2E42: moveq #0,d0 + move.w (a0)+,d0 + beq T2E43 + cmp.l 4(a0),d2 + bls T2E421 + lsl.l #2,d0 + movea.l d0,a1 + move.l (a0)+,d1 + addq.l #4,a0 + cmp.l (a1),d1 + beq T2E42 + moveq #-2,d0 * 違っていたら解除しない + rts +T2E421: addq.l #8,a0 + bra T2E42 + +T2ERR1: moveq #-1,d0 + rts + +T2E43: +VCTRTN: lea VECTBL-WK(a6),a0 * ←常駐失敗時のエントリ + move.l #PCM8NG,CHKFLG-WK(a6) * 認識用フラグを壊す + move.l #PCM8NG,CHKFL2-WK(a6) * 認識用フラグを壊す + moveq #-2,d1 * 常駐解除を実行 +T2E431: move.w (a0)+,d0 + beq T2E433 + addq.l #4,a0 + cmp.l (a0),d1 + bls T2E432 + move.l (a0),-(sp) + move.w d0,-(sp) + DOS _INTVCS + addq.l #6,sp +T2E432: move.l d1,(a0)+ * 元のベクタ情報無効 + bra T2E431 +T2E433: btst #0,SYSFLG-WK(a6) + bne T2E436 + lea WKADF1-WK(a6),a0 + moveq #WKCNT-1,d1 + subq.l #4,sp +T2E434: bclr #1,(a0) + beq T2E435 + move.l 6(a0),(sp) * 確保したメモリを開放 + DOS _MFREE +T2E435: lea 10(a0),a0 + dbra d1,T2E434 + pea TOPADR-$F0(pc) + DOS _MFREE + addq.l #8,sp +T2E436: moveq #0,d0 + rts + +T2E45: cmpi.w #WKCNT,d1 * $FFFC:ワークエリア情報 + bcc T2ERR1 + lea WKADR1-WK(a6),a0 + move.w d1,d0 + add.w d1,d1 + add.w d1,d1 + add.w d0,d1 + add.w d1,d1 + move.l (a0,d1.w),d0 + rts + +T2E46: lea VECTBL-WK-8(a6),a2 * $FFFD:元のベクタ情報を読む +T2E461: addq.l #8,a2 + move.w (a2)+,d0 + beq T2E462 + cmp.w d0,d1 + bne T2E461 + move.l 4(a2),d0 + rts +T2E462: tst.w d1 + bne T2ERR2 + move.l (a2),d0 + rts + +T2KEEP: lea WK(pc),a6 * trap #2 のベクタを設定 + lea T2VECA.w,a2 + lea T2ENT-WK(a6),a3 + cmpa.l (a2),a3 + beq T2KEE2 + lea VECTBL-WK(a6),a1 + moveq #-1,d0 +T2KEE1: move.w (a1)+,d0 + beq T2KEE2 + addq.l #8,a1 + cmpi.w #T2VECT,d0 + bne T2KEE1 + move.l (a2),-4(a1) + move.l a3,(a2) +T2KEE2: rts + +T2E47: ori.w #$0700,sr * $FFFE:常駐 + lea VECTBL-WK(a6),a2 + movea.l a2,a3 +T2E471: moveq #0,d0 + move.w (a2)+,d0 + beq T2E473 + cmpi.w #T2VECT,d0 * trap #2 のベクタは無視 + beq T2E472 + lsl.l #2,d0 + movea.l d0,a0 + move.l (a0),d0 + cmp.l (a2),d0 + addq.l #8,a2 + bne T2E471 +T2ERR2: moveq #-1,d0 + rts * 同じベクタがあったらエラー +T2E472: addq.l #8,a2 + bra T2E471 +T2E473: bsr T2KILL + sf SKPFLG-WK(a6) +T2E474: move.w (a3)+,d0 * ベクタを設定 + beq T2E476 + cmpi.w #T1VECT,d0 + beq T2E477 +T2E475: move.l (a3)+,-(sp) + move.w d0,-(sp) + DOS _INTVCS + addq.l #6,sp + addq.l #4,a3 + cmp.l -8(a3),d0 * 同じアドレスは保存しない + beq T2E474 + move.l d0,-4(a3) + bra T2E474 +T2E476: move.l #PCM8OK,CHKFLG-WK(a6) * 認識用フラグを戻す + move.l #MPCMOK,CHKFL2-WK(a6) * 認識用フラグを戻す + bsr T2ACTV + moveq #0,d0 + rts +T2E477: move.w d0,-(sp) + bsr T1VCHK + movem.w (sp)+,d0 + beq T2E475 + addq.l #8,a3 + bra T2E474 + +T2E5: moveq #0,d0 * $FFF0:割り込み中フラグチェック + move.b ENDFLG-WK(a6),d0 + rts + +T2E51: ori.w #$0700,sr * $FFF1:PCM8A内部初期化 + bsr T2ACTV + sf PCMFL2-WK(a6) + tst.b ENDFLG-WK(a6) + beq T2E52 + lea MFPIMA,a1 * 割り込みマスク復帰 + movep.w -$C(a1),d0 + tst.b DMACH3-MFPIMA(a1) + sf ENDFLG-WK(a6) + movep.w d0,0(a1) + bsr DSPCLR +T2E52: moveq #0,d0 + rts + +T2ENT8: ext.w d0 + add.w d0,d0 + move.w T2JTB2(pc,d0.w),d0 + jmp T2JTB2(pc,d0.w) + +T2JTB2: .dc.w T2X7-T2JTB2 * $01F7:周波数モード設定 + .dc.w T2X8-T2JTB2 * $01F8:PCM8Aシステム情報設定 + .dc.w T2X0-T2JTB2 * $01F9:PCM8Aシステム情報 + .dc.w T2X1-T2JTB2 * $01FA:PCM8Aステータス + .dc.w T2X2-T2JTB2 * $01FB:MPU・MFP割り込みマスク設定 + .dc.w T2X3-T2JTB2 * $01FC:多重・単音モードの設定 + .dc.w T2ERR3-T2JTB2 * $01FD:reserve + .dc.w T2X4-T2JTB2 * $01FE:占有 + .dc.w T2X5-T2JTB2 * $01FF:占有解除 + +T2ENT9: cmpi.w #$7F00,d0 + beq T2E90 + cmpi.w #$7F02,d0 + beq T2E92 + cmpi.w #$7F03,d0 + beq T2E93 + cmpi.w #$7F04,d0 + beq T2E94 + cmpi.w #$7F10,d0 + beq T2E9A + cmpi.w #$7F11,d0 + beq T2E9B + cmpi.w #$7F12,d0 + beq T2E9C +T2ERR3: moveq #-1,d0 + rts + +T2E90: moveq #0,d0 * $7F00:動作状態表示モード設定 + subq.w #1,d1 + bhi T2E901 + seq DSPFLG-WK(a6) + rts +T2E901: not.b DSPFLG-WK(a6) + rts + +T2E92: moveq #$4F,d2 * $7F02:多重/単音モード設定 + move.b SYSFLG-WK(a6),d3 + and.b d3,d2 + moveq #0,d0 + subq.w #1,d1 + beq T2X3X + bcc T2E922 + ori.b #$30,d2 + bra T2X3X +T2E922: ori.b #$10,d2 + bra T2X3X + +T2E93: cmp.b #$FE,d1 * $7F03:IOCS使用チャンネル数設定 + bne T2E931 + st IOCHMX-WK(a6) + bra T2E932 +T2E931: cmp.b PCMCMX+1-WK(a6),d1 + bhi T2ERR3 + move.b d1,IOCHMX-WK(a6) + cmp.b PCMCHN+1-WK(a6),d1 + bls T2E933 +T2E932 move.b PCMCHN+1-WK(a6),d1 +T2E933: move.b d1,IOCHN-WK(a6) + moveq #0,d0 + rts + +T2E94: moveq #0,d0 + subq.w #1,d1 * $7F04:音量固定モード設定 + beq T2E941 + bcc T2E942 + bset #1,SYSFLG-WK(a6) + rts +T2E941: bclr #1,SYSFLG-WK(a6) + rts +T2E942: bchg #1,SYSFLG-WK(a6) + rts + +T2E9A: move.l a6,d0 * $7F10:内部ワークポインタ取得 + rts + +T2E9B: movea.l KEPBUF-WK(a6),a0 * $7F11:占有バッファ先頭アドレス + move.l a0,d0 + rts + +T2E9C: move.l #KEPNUM*$10000+KEPSIZ,d0 * $7F12:占有バッファ長さ + rts + +T2X7: moveq #0,d0 * $01F7:周波数モード設定 + move.w FRQMOD-WK(a6),d0 + subq.b #4,d0 + andi.b #7,d0 + tst.l d1 + bmi T2X75 + ror.w #8,d1 + cmpi.b #$FF,d1 + bne T2X71 + ror.w #8,d0 + move.b d0,d1 + rol.w #8,d0 +T2X71: rol.w #8,d1 + cmpi.b #$FF,d1 + bne T2X72 + move.b d0,d1 + addq.b #4,d1 + andi.b #7,d1 +T2X72: cmpi.w #$500,d1 + bcc T2X75 + cmpi.w #$100,d1 + bcc T2X73 + cmpi.b #4,d1 + bcc T2X73 + clr.b d1 +T2X73: cmpi.b #7,d1 + bhi T2X75 + subq.b #4,d1 + andi.b #7,d1 + lea FRQTBL(pc),a0 + move.w #$0700,d2 + and.w d1,d2 + lsr.w #5,d2 + adda.w d2,a0 + moveq #7,d2 + and.b d1,d2 + move.b (a0,d2.w),d2 + btst #6,d2 + bne T2X75 + move.w sr,d2 + ori.w #$0700,sr + bsr T2KILL + move.w d1,FRQMOD-WK(a6) + move.l a0,FRQPTR-WK(a6) + move.b d1,d0 + bsr FRQSET + move.w d2,sr + move.b PCMBN0+1-WK(a6),d1 + bsr T2X84 +T2X75: rts + +T2X8: move.b PCMCHN+1-WK(a6),-(sp) * $01F8:PCM8Aシステム情報設定 + move.w (sp),d0 + move.b PCMBN0+1-WK(a6),d0 + swap d0 + move.b VOLMX0+1-WK(a6),(sp) + move.w (sp)+,d0 + move.b VOLMN0+1-WK(a6),d0 + addq.l #1,d1 + bcs T2X8X + subq.l #1,d1 + lea PCMXT4-WK(a6),a0 +T2X81: move.w d1,d2 * 音量最大値 + lsr.w #8,d2 + cmpi.w #$00FF,d2 + bcs T2X811 + move.b VOLMX0+1-WK(a6),d2 +T2X811: cmpi.b #16,d2 + bcc T2X812 + move.b (a0,d2.w),d2 +T2X812: cmp.b VOLMAX+1-WK(a6),d2 + bls T2X82 + move.b VOLMAX+1-WK(a6),d2 +T2X82: move.w d1,d3 * 音量最小値 + andi.w #$00FF,d3 + cmpi.w #$00FF,d3 + bcs T2X821 + move.b VOLMN0+1-WK(a6),d3 +T2X821: cmpi.b #16,d3 + bcc T2X822 + move.b (a0,d3.w),d3 +T2X822: cmp.b VOLMIN+1-WK(a6),d3 + bcc T2X823 + move.b VOLMIN+1-WK(a6),d3 +T2X823: cmp.w d2,d3 + bcc T2X824 + exg d2,d3 +T2X824: movem.w d2-d3,VOLMN0-WK(a6) +T2X83: swap d1 * チャンネル数最大値 + move.w d1,d2 + lsr.w #8,d2 + beq T2X830 + cmpi.w #$00FF,d2 + bcs T2X831 +T2X830: move.b PCMCHN+1-WK(a6),d2 +T2X831: cmp.b PCMCMX+1-WK(a6),d2 + bls T2X832 + move.b PCMCMX+1-WK(a6),d2 +T2X832: + move.b IOCHMX-WK(a6),d3 + cmp.b d2,d3 + bls T2X833 + move.b d2,d3 +T2X833: move.b d3,IOCHN-WK(a6) + move.b PCMCHN+1-WK(a6),d3 + sub.b d2,d3 + bcc T2X836 + neg.b d3 * チャンネル数増加時,未使用チャンネル停止 + movea.l CHNWK-WK(a6),a0 + move.w d2,d4 + sub.b d3,d4 + lsl.w #7,d4 + lea (a0,d4.w),a0 + bra T2X835 +T2X834: tas (a0) + lea CHNSIZ(a0),a0 +T2X835: dbra d3,T2X834 +T2X836: move.w d2,PCMCHN-WK(a6) +T2X84: andi.w #$00FF,d1 * 処理バイト数/12 + beq T2X840 + cmpi.w #$00FF,d1 + bcs T2X841 +T2X840: move.b PCMBN0+1-WK(a6),d1 +T2X841: cmp.b PCMBNX+1-WK(a6),d1 + bls T2X842 + move.b PCMBNX+1-WK(a6),d1 +T2X842: moveq #0,d2 + move.b FRQSEL-WK(a6),d2 + add.w d2,d2 + move.w FREQ1-WK(a6,d2.w),d2 + mulu.w d1,d2 + btst #0,d2 + beq T2X843 + addq.w #1,d2 +T2X843: move.w sr,d7 + ori.w #$0700,sr + move.w d1,PCMBN0-WK(a6) + move.w d2,PCMBL0-WK(a6) + move.w d2,PCMBR0-WK(a6) + move.w #$2000,PCMFLG-WK(a6) + move.w d7,sr +T2X8X: rts + +T2X0: move.w PCMBL0-WK(a6),d0 * $01F9:PCM8Aシステム情報 + swap d0 + move.b VOLMX0+1-WK(a6),-(sp) + move.w (sp)+,d0 + move.b VOLMN0+1-WK(a6),d0 + rts + +T2X1: moveq #0,d0 * $01FA:PCM8Aステータス + move.b PCMCHN+1-WK(a6),-(sp) + move.w (sp)+,d0 + move.b ACTFLG-WK(a6),d0 * 動作中のチャンネル数 + swap d0 + move.b SYSFLG-WK(a6),d0 * デバイスドライバ組み込み/音量固定モードフラグ + andi.b #7,d0 + eori.b #6,d0 + tst.b DSPFLG-WK(a6) * 動作表示モード + bpl T2X10 + bset #3,d0 +T2X10: move.b d0,-(sp) + move.w (sp)+,d0 + move.b IOCHN-WK(a6),d0 * IOCS使用チャンネル数 + swap d0 + tst.l d1 + bmi T2X16 + swap d1 + cmpi.b #$FE,d1 + bne T2X11 + st IOCHMX-WK(a6) + bra T2X12 +T2X11: cmp.b PCMCMX+1-WK(a6),d1 * IOCS使用チャンネル数設定 + bhi T2X14 + move.b d1,IOCHMX-WK(a6) + cmp.b PCMCHN+1-WK(a6),d1 + bls T2X13 +T2X12: move.b PCMCHN+1-WK(a6),d1 +T2X13: move.b d1,IOCHN-WK(a6) +T2X14: btst #11,d1 + beq T2X15 + not.b DSPFLG-WK(a6) * 動作表示モード反転 +T2X15: btst #10,d1 + beq T2X16 + bchg #2,SYSFLG-WK(a6) * 音量固定モード反転 +T2X16: rts + +T2X2: move.l INTWK-WK(a6),d0 * $01FB:MPU・MFP割り込み設定 + swap d0 + andi.w #$0700,d0 + ror.w #8,d0 + swap d0 + tst.l d1 + bmi T2X22 + moveq #$F8,d3 + moveq #5,d2 + swap d1 + andi.b #7,d1 + cmp.b d1,d2 + bcc T2X21 + move.b d1,d2 +T2X21: or.w d3,d1 + rol.w #8,d1 + swap d1 + or.w d3,d2 + rol.w #8,d2 + ori.w #$0700,sr + move.l d1,INTWK-WK(a6) + move.w d2,INTWK2-WK(a6) +T2X22: rts + +T2X3: move.b SYSFLG-WK(a6),d2 * $01FC:多重・単音モードの設定 + move.b d2,d3 + moveq #0,d0 + tst.b d2 + bmi T2X31 + lsr.b #4,d2 + andi.w #7,d2 + move.b T2X3T(pc,d2.w),d0 +T2X31: tst.w d1 + bmi T2X34 + moveq #$2F,d2 + and.b SYSFLG-WK(a6),d2 + tst.w d1 + beq T2X32 + cmpi.w #2,d1 + bhi T2ERR4 + bne T2X3X + ori.b #$10,d2 + bra T2X3X +T2X32: ori.b #$50,d2 +T2X3X: cmpi.b #$20,d2 + bcs T2X33 + ori.b #$90,d2 +T2X33: move.b d2,SYSFLG-WK(a6) + eor.b d2,d3 + bpl T2X34 + bsr T2ACT0 +T2X34: rts + +T2ERR4: moveq #-1,d0 + rts + +T2X3T: .dc.b 1,2,0,0,0,0,0,0 + +T2X4: tst.b KEEPFL-WK(a6) * $01FE:占有 + bmi T2ERR4 + st KEEPFL-WK(a6) + moveq #0,d0 + rts + +T2X5: tst.b KEEPFL-WK(a6) * $01FF:占有解除 + bpl T2ERR4 + sf KEEPFL-WK(a6) + moveq #0,d0 + rts + +*-------------------------------------------------------------------- +* ここからはサブルーチン群 + +T2ACTV: move.w sr,-(sp) * DMAC/ADPCMを動作状態にする + ori.w #$0700,sr + movem.l d0-d1/a0/a5,-(sp) + st PANWK-WK(a6) + moveq #0,d1 + bsr PANSET + bsr PANCNG + bsr DMASTP + bsr T2WCLR + move.b FRQSEL-WK(a6),d0 + bsr FRQSET + movea.l ADPBFX-WK(a6),a0 + moveq #PCMBGN,d1 + bsr DMASTA +T2ACT1: movem.l (sp)+,d0-d1/a0/a5 + move.w (sp)+,sr + rts + +T2ACT0: move.w sr,-(sp) + ori.w #$0700,sr + movem.l d0-d1/a0/a5,-(sp) + lea DMACH3,a5 + bsr DMASP1 + bsr T2WCLR + move.b FRQSEL-WK(a6),d0 + bsr FRQSET + movea.l ADPBFX-WK(a6),a0 + moveq #PCMBGN,d1 + bsr DMASA1 + bra T2ACT1 + +T2KILL: move.w sr,-(sp) * 全チャンネル強制停止&初期化 + ori.w #$0700,sr + movem.l d0-d7/a0-a1/a5,-(sp) + moveq #0,d1 + move.w d1,ADIOCS.w + move.b d1,M1MOD-WK(a6) + move.l d1,M1LEN-WK(a6) + bsr DMASTP + bsr PANSET + bsr PANCNG +T2KIL1: bsr T2WCLR + bsr DSPCLR + movem.l (sp)+,d0-d7/a0-a1/a5 + move.w (sp)+,sr + rts + +T2KIL0: move.w sr,-(sp) + ori.w #$0700,sr + movem.l d0-d7/a0-a1/a5,-(sp) + lea DMACH3,a5 + bsr DMASP1 + bra T2KIL1 + +DSPCLR: tst.b DSPFLG-WK(a6) + bpl DSPCL1 + move.w #DCOL0,TXTPL0 * 動作状態表示OFF +DSPCL1: rts + +DMASTA: lea DMACH3,a5 * DMA転送開始 +DMASA0: move.b #$01,PCMCNT +DMASA1: move.b #$10,7(a5) + st.b (a5) + move.b #PCMSP2,PCMDAT + move.l #PCMDAT,$14(a5) + move.l a0,$C(a5) + move.w d1,$A(a5) + move.l #$02888004,d0 + movep.w d0,4(a5) + swap d0 + movep.w d0,5(a5) + move.b #$02,PCMCNT + tas (a6) + rts + +DMASTP: lea DMACH3,a5 * DMA停止 + lea WK(pc),a6 +DMASP0: move.b #$01,PCMCNT * ADPCM停止 +DMASP1: move.b #PCMSP2,PCMDAT + move.b #$10,7(a5) * DMAC強制停止 + st.b (a5) + sf ACTFLG-WK(a6) + tas (a6) + rts + +DMASPX: move.b #$10,7(a5) + st.b (a5) + move.b #PCMSP2,PCMDAT + move.l ADPBFX-WK(a6),$C(a5) + move.w #1,$A(a5) + move.l #$02808004,d0 + movep.w d0,4(a5) + swap d0 + movep.w d0,5(a5) + sf ACTFLG-WK(a6) + tas (a6) + rts + +T2WCLR: movem.l d0-d7/a0,-(sp) * 全チャンネル初期化 + move.w PCMCMX-WK(a6),d6 + move.w d6,d0 + lsl.w #7,d0 + movea.w d0,a0 + adda.l CHNWK-WK(a6),a0 + move.l DPCMBF-WK(a6),d0 + move.l TBLAD1-WK(a6),d1 + moveq #0,d2 + moveq #0,d3 + moveq #0,d4 + move.l #0,d5 + subq.w #1,d6 + move.l #P16X0,d7 +T2WCL1: movem.l d2-d5,-(a0) + movem.l d2-d5,-(a0) + move.l d2,-(a0) + move.l #$04000000,-(a0) + move.l #$40000000,-(a0) + move.l #$FF401000,-(a0) + movem.l d2-d5,-(a0) + movem.l d2-d5,-(a0) + movem.l d0/d3-d4/d7,-(a0) + movem.l d2-d5,-(a0) + movem.l d1-d3,-(a0) + move.l #$C0080403,-(a0) + dbra d6,T2WCL1 + move.l d2,M1LEN-WK(a6) + sf M1MOD-WK(a6) + sf ACTFLG-WK(a6) + sf (a6) + movem.l (sp)+,d0-d7/a0 + rts + +TBLCLR: movem.l d0/a0,-(sp) * 全チャンネル停止 + movea.l CHNWK-WK(a6),a0 + moveq #-1,d0 + add.w PCMCMX-WK(a6),d0 +TBLCL1: tas (a0) + lea CHNSIZ(a0),a0 + dbra d0,TBLCL1 + sf ACTFLG-WK(a6) + sf (a6) + movem.l (sp)+,d0/a0 + rts + +TCWTBL: .dc.b 10,8,5,4,3,2,1,0 + +TCWAIT: movem.l d0-d3/a0-a1,-(sp) * TIMER-CによるWAIT+データキャッシュクリア + lsr.w #8,d1 + moveq #7,d0 + and.w d1,d0 + move.b TCWTBL(pc,d0.w),d0 + lea MFPTMC,a0 + moveq #CACHEL-1,d1 + add.l d1,d2 + lsr.l #CACHES,d2 + move.b (a0),d1 + move.b (a0),d1 + cmpi.b #3,MPUFLG.w + bhi TCWAI3 + bcs TCWAI1 + .dc.w $4E7A,$3002 * movec cacr,d3 + ori.w #$0800,d3 + .dc.w $4E7B,$3002 * movec d3,cacr + andi.w #$F7FF,d3 + .dc.w $4E7B,$3002 * movec d3,cacr +TCWAI1: moveq #-1,d2 +TCWAI3: tst.l d2 + bmi TCWAI4 + .dc.w $F469 * cpushl dc,(a1) + lea CACHEL(a1),a1 + subq.l #1,d2 + bcc TCWAI4 + moveq #-1,d2 +TCWAI4: move.l d1,d3 + move.b (a0),d1 + sub.b d1,d3 + beq TCWAI3 + bhi TCWAI5 + moveq #1,d3 +TCWAI5: sub.l d3,d0 + bhi TCWAI3 + tst.l d2 + bmi TCWAI7 +TCWAI6: .dc.w $F469 * cpushl dc,(a1) + lea CACHEL(a1),a1 + subq.l #1,d2 + bcc TCWAI6 +TCWAI7: movem.l (sp)+,d0-d3/a0-a1 + rts + +TBLCHK: tst.b SYSFLG-WK(a6) * $008x:データ長問い合せ + bmi TBLCH3 + move.b (a5),d0 + bmi TBLCH1 + andi.w #3,d0 + bne TBLCH2 + move.l $28(a5),d0 + sub.l $1C(a5),d0 + rts + +TBLCH2: neg.w d0 + ext.l d0 + rts + +TBLCH3: btst #0,(a6) + beq TBLCH1 + moveq #-3,d0 + rts + +T2XE1: tst.l d2 * 出力処理(通常,アレイチェーン) + bmi TBLCHK +T2XE2: lsl.w #7,d0 * 出力処理(リンクアレイチェーン) + swap d1 + andi.w #$00FF,d1 + or.w d0,d1 + swap d1 +T2XE10: tst.b SYSFLG-WK(a6) * 出力開始(IOCSのエントリポイント) + bmi T2XEM + move.b ADIOCS.w,d0 + beq T2XE11 + cmpi.b #PCM8FL,d0 + beq T2XE11 + moveq #-1,d0 + rts + +T2XE1X: move.b ADIOCS.w,d0 * 一時停止解除時のエントリポイント + beq T2XE1S + cmpi.b #PCM8FL,d0 + beq T2XE1S + moveq #-1,d0 + rts + +T2XE1S: move.b FRQSEL-WK(a6),d0 + bsr FRQSET + bra T2XE1Y + +T2XE11: move.b FRQSEL-WK(a6),d0 + bsr FRQSET + tst.b SKPFLG-WK(a6) + bne T2XE13 + bclr #1,(a6) + beq T2XE14 +T2XE13: bsr TBLCLR + sf SKPFLG-WK(a6) +T2XE14: bsr TBLSET +T2XE1Y: movem.l d1-d2/a0/a5,-(sp) + movea.l CHNWK-WK(a6),a0 + moveq #-1,d1 + add.w PCMCHN-WK(a6),d1 + moveq #$80,d0 +T2XE1A: and.b (a0),d0 + lea CHNSIZ(a0),a0 + dbeq d1,T2XE1A + bne T2XE1D + move.w #PCM8FL*$100,ADIOCS.w + lea DMACH3,a5 + movea.l ADPBFX-WK(a6),a0 + move.l #$02C88004,d1 + move.w sr,d2 + move.w #$0700,d0 + and.w d2,d0 + cmpi.w #$0300,d0 + bcc T2XE1B + ori.w #$0300,sr +T2XE1B: moveq #8,d0 + or.b d0,(a6) + tst.b ENDFLG-WK(a6) + bne T2XE1C + ori.w #$0700,sr + and.b (a5),d0 + bne T2XE1C + tas (a6) + move.b #$10,7(a5) + st (a5) + move.l a0,$C(a5) + move.w #PCMBGN,$A(a5) + move.l a0,$1C(a5) + move.w PCMBR2-WK(a6),$1A(a5) + movep.w d1,4(a5) + swap d1 + movep.w d1,5(a5) + move.b #$02,PCMCNT +T2XE1C: move.w d2,sr +T2XE1D: movem.l (sp)+,d1-d2/a0/a5 +T2XE1E: moveq #0,d0 + rts + +T2XE1R: + moveq #-1,d0 + rts + +T2XEM: move.b ADIOCS.w,d0 * 単音再生モード + beq T2XM0 + cmpi.b #PCM8FL,d0 + bne T2XE1R +T2XM0: movem.l d1-d5,-(sp) + lea DMACH3,a5 + move.w sr,d4 + move.w d4,d5 + ori.w #$0700,d5 + move.w d5,sr + sf M1MOD-WK(a6) + clr.l M1LEN-WK(a6) + move.b #PCM8FL,ADIOCS.w + sf ACTFLG-WK(a6) + bclr #0,(a6) + move.b #$10,7(a5) * DMAC停止 + st (a5) + move.b #PCMSP2,PCMDAT + move.w d4,sr + move.l d2,d3 + moveq #10,d2 + cmpi.l #$02000000,d1 + bcc T2XM1 + tst.l d2 + beq T2XM9 + move.l d3,d2 + cmpi.l #$01000000,d1 + bcs T2XM1 + add.l d2,d2 + add.l d3,d2 + add.l d2,d2 +T2XM1: bsr TCWAIT + move.w d1,d0 * 周波数設定 + move.w d0,-(sp) + move.b (sp)+,d0 + cmpi.b #11,d0 + bcc T2XM9 + ext.w d0 + move.b MODTBL-WK(a6,d0.w),d0 + bmi T2XM9 + bsr FRQSET + tst.b d1 + beq T2XM9 + cmpi.b #4,d1 + bcs T2XM2 + move.b PANWK-WK(a6),d1 +T2XM2: bsr PANSET * 定位設定 + bsr PANCNG + movea.l ADPBFX-WK(a6),a0 + move.w d5,sr + move.b #$10,7(a5) + st (a5) + move.l a0,$C(a5) + move.w PCMBL0-WK(a6),$A(a5) + move.l #$02888004,d0 + movep.w d0,4(a5) + swap d0 + movep.w d0,5(a5) + move.b #$02,PCMCNT + bset #0,(a6) + move.w d4,sr + move.l d1,d0 + rol.l #8,d0 + andi.b #3,d0 + move.w d5,sr + move.b d0,M1MOD-WK(a6) + subq.b #1,d0 + beq T2XMA + bcc T2XM8 + move.l #$FFF0,d2 * 通常モード + cmp.l d2,d3 + bcc T2XM5 + move.l d3,d2 +T2XM5: move.w d2,$1A(a5) + move.l a1,$1C(a5) + sub.l d2,d3 + adda.l d2,a1 + move.b #$48,7(a5) +T2XM8: move.l d3,M1LEN-WK(a6) * 割り込みルーチンで使用する情報をセット + move.l a1,M1ADR-WK(a6) +T2XM9: move.w d4,sr + movem.l (sp)+,d1-d5 + moveq #0,d0 + rts + +T2XMA: moveq #0,d2 * アレイチェーンモード(テーブルの数は65535まで) + not.w d2 + cmp.l d2,d3 + bls T2XM8 + move.l d2,d3 + bra T2XM8 + +T2STOP: tas (a5) * $00Bx:チャンネル一時停止 +TBLCH1: moveq #0,d0 + rts + +T2CONT: move.w sr,-(sp) * $00Cx:チャンネル一時停止解除 + ori.w #$0700,sr + andi.b #$7F,(a5) + ori.b #$40,(a5) + move.w (sp)+,sr + bra T2XE1X + +TBLMOD: move.l (a5),d0 * $009x:動作モード問い合せ + andi.l #$00FFFFFF,d0 + rts + +TBLADR: btst #2,ADIOCS.w * $00Ax:アクセスアドレス問い合せ + bne TBLADR1 + tst.b SYSFLG-WK(a6) + bmi TBLADR1 + move.l $1C(a5),d0 + rts + +TBLADR1: * 単音再生モード/録音中 + lea DMACH3+$C,a0 + moveq #2,d2 * 繰り返しは3回まで + move.w sr,d3 +TBLADR2: + ori.w #$0700,sr + move.l (a0),d1 + move.l (a0),d0 + move.w d3,sr + sub.l d0,d1 + bcc TBLADR3 + neg.l d1 +TBLADR3: + cmpi.l #$8000,d1 + dbcs d2,TBLADR2 + rts + +TBLCNG: movem.l d0-d5/a0,-(sp) * $007x:動作モード変更 + andi.l #$00FFFFFF,d1 + tst.b d1 * 定位 + beq TBLC01 + cmpi.b #4,d1 + bcc TBLC02 + bsr PANSET + bra TBLC03 +TBLC01: bset #31,d1 +TBLC02: move.b 3(a5),d1 +TBLC03: ror.w #8,d1 + cmpi.b #$40,d1 * 周波数 + bcs TBLC11 + move.b 2(a5),d1 +TBLC11: swap d1 + moveq #0,d3 + movem.w VOLMN0-WK(a6),d0/d2 + move.b d1,d3 * 音量 + cmpi.b #$FF,d3 + bne TBLC12 + move.b 1(a5),d1 + move.b d1,d3 +TBLC12: cmpi.b #15,d3 + bhi TBLC13 + move.b PCMXT4-WK(a6,d3.w),d3 +TBLC13: cmp.b d0,d3 + bcs TBLC21 + cmp.b d2,d3 + bls TBLC22 + move.b d2,d3 + move.b d2,d1 + bra TBLC22 +TBLC21: move.b d0,d3 + move.b d0,d1 +TBLC22: swap d1 + moveq #$3F,d2 + and.b d1,d2 + move.b MODTBL-WK(a6,d2.w),d0 + moveq #$3F,d2 + and.b 2(a5),d2 + move.b MODTBL-WK(a6,d2.w),d2 + eor.b d0,d2 + andi.w #$F0,d2 + bne TBLCER + bclr #7,d0 * 周波数によって分岐 + bne TBLC41 + bclr #6,d0 + bne TBLCER + andi.w #7,d0 * ADPCM + move.b d0,d5 + movem.l d1-d3,-(sp) + add.w d0,d0 + move.w FREQ-WK(a6,d0.w),d0 + moveq #0,d1 + move.b FRQSEL-WK(a6),d1 + add.w d1,d1 + move.w FREQ-WK(a6,d1.w),d1 + moveq #0,d2 + moveq #0,d3 + bsr FRQCAL + move.l d0,d4 + movem.l (sp)+,d1-d3 + beq TBLCER + bsr FRQADP + movea.l d0,a0 + rol.w #8,d1 + move.b #VOLOFS,d2 + moveq #6,d0 * 音量固定チェック + and.b SYSFLG-WK(a6),d0 + bne TBLC31 + move.b d3,d2 +TBLC31: sub.w VOLMIN-WK(a6),d2 + addi.w #VOLWID+1,d2 + swap d2 + lsr.l #6,d2 + bra TBLC51 + +TBLC41: bclr #6,d0 * PCM + bne TBLC42 + lea PCMXT2(pc),a0 * 16ビットPCM + bra TBLC43 + +TBLC42: lea PCMXT3(pc),a0 * 8ビットPCM +TBLC43: andi.w #7,d0 + move.b d0,d5 + movem.l d0-d3,-(sp) + add.w d0,d0 + move.w FREQ-WK(a6,d0.w),d0 + moveq #0,d1 + move.b FRQSEL-WK(a6),d1 + add.w d1,d1 + move.w FREQ-WK(a6,d1.w),d1 + moveq #64,d2 + moveq #64,d3 + bsr FRQCAL + move.l d0,d4 + movem.l (sp)+,d0-d3 + beq TBLCER + rol.w #8,d1 + move.b #VOLOFS,d2 + moveq #6,d0 * 音量固定チェック + and.b SYSFLG-WK(a6),d0 + bne TBLC44 + move.b d3,d2 * 処理アドレス +TBLC44: subi.b #VOLMN2,d2 + add.w d2,d2 + add.w d2,d2 + movea.l (a0,d2.w),a0 + +TBLC51: move.l #$FF000000,d0 + move.w sr,-(sp) + ori.w #$0700,sr + and.l (a5),d0 + or.l d0,d1 + move.l d1,(a5) * フラグ変更 + move.l d2,$24(a5) * 音量変換用オフセット変更 + move.l d4,$18(a5) * 出力周波数変更 + move.l a0,$2C(a5) * 処理ルーチンアドレス変更 + moveq #0,d0 + move.b $51(a5),d0 + lsl.w #6,d0 + move.w d0,$52(a5) + move.w (sp)+,sr + move.b SYSFLG-WK(a6),d0 + bpl TBLCNE + bsr PANCNG * 単音再生モード時の処理 + move.w d1,-(sp) + move.b (sp)+,d0 + ext.w d0 + move.b MODTBL-WK(a6,d0.w),d0 + bmi TBLCNE + bsr FRQSET +TBLCNE: movem.l (sp)+,d0-d5/a0 + rts + +TBLCER: tas (a5) + bra TBLCNE + +TBLSET: movem.l d0-d7/a0-a4,-(sp) * チャンネル動作設定 + lea -CHNSIZ(sp),sp + movea.l sp,a4 + btst #25,d1 + bne TBLS00 + tst.l d2 + beq TBLS5X +TBLS00: tst.b d1 * 定位 + beq TBLS02 + cmpi.b #4,d1 + bcs TBLS01 + move.b 3(a5),d1 +TBLS01: bsr PANSET + bra TBLS03 +TBLS02: bset #31,d1 + move.b 3(a5),d1 +TBLS03: ror.w #8,d1 + cmpi.b #$40,d1 * 周波数 + bcs TBLS11 + move.b 2(a5),d1 +TBLS11: swap d1 + moveq #0,d5 + movem.w VOLMN0-WK(a6),d3-d4 + move.b d1,d5 * 音量 + cmpi.b #$FF,d5 + bne TBLS12 + move.b 1(a5),d1 + move.b d1,d5 +TBLS12: cmpi.b #15,d5 + bhi TBLS13 + move.b PCMXT4-WK(a6,d5.w),d5 +TBLS13: cmp.b d3,d5 + bcs TBLS21 + cmp.b d4,d5 + bls TBLS22 + move.b d4,d1 + move.b d4,d5 + bra TBLS22 +TBLS21: move.b d3,d1 + move.b d3,d5 +TBLS22: ori.w #$4000,d1 * 初期化フラグセット + swap d1 + moveq #$3F,d0 + and.b d1,d0 + move.b MODTBL-WK(a6,d0.w),d0 + move.b d0,d3 + bmi TBLS41 + andi.w #7,d0 * ADPCM + moveq #0,d6 + move.b d0,d6 + movem.l d1-d3,-(sp) + add.w d0,d0 + move.w FREQ-WK(a6,d0.w),d0 + moveq #0,d1 + move.b FRQSEL-WK(a6),d1 + add.w d1,d1 + move.w FREQ-WK(a6,d1.w),d1 + moveq #0,d2 + moveq #0,d3 + bsr FRQCAL + move.l d0,d7 + movem.l (sp)+,d1-d3 + beq TBLS5X + bsr FRQADP + movea.l d0,a2 * 処理アドレス + rol.w #8,d1 + swap d1 + move.l TBLAD1-WK(a6),d3 * 倍率テーブルアドレス + moveq #0,d4 + move.b #VOLOFS,d4 + moveq #6,d0 * 音量固定チェック + and.b SYSFLG-WK(a6),d0 + bne TBLS31 + move.b d5,d4 +TBLS31: sub.b VOLMIN+1-WK(a6),d4 + addi.w #VOLWID+1,d4 + swap d4 + lsr.l #6,d4 + bra TBLS51 + +TBLS41: bchg #6,d0 + bne TBLS42 * PCM + lea PCMXT2(pc),a0 * 16ビットPCM + rol.w #8,d1 + swap d1 + moveq #4,d6 + move.w d1,d0 + andi.w #$0300,d0 + bne TBLS46 + btst #0,d2 + bne TBLS45 +TBLS46: move.l a1,d0 + andi.w #1,d0 + beq TBLS43 +TBLS45: ori.w #$8000,d1 + bra TBLS43 + +TBLS42: bchg #5,d0 + bne TBLS5X + lea PCMXT3(pc),a0 * 8ビットPCM + rol.w #8,d1 + swap d1 + moveq #8,d6 +TBLS43: moveq #7,d0 + and.w d3,d0 + swap d6 + move.b d0,d6 + movem.l d1-d3,-(sp) + add.w d0,d0 + move.w FREQ-WK(a6,d0.w),d0 + moveq #0,d1 + move.b FRQSEL-WK(a6),d1 + add.w d1,d1 + move.w FREQ-WK(a6,d1.w),d1 + moveq #0,d2 + moveq #0,d3 + bsr FRQCAL + move.l d0,d7 + movem.l (sp)+,d1-d3 + beq TBLS51 + moveq #0,d4 + move.b #VOLOFS,d4 + moveq #6,d3 * 音量固定チェック + and.b SYSFLG-WK(a6),d3 + bne TBLS44 + move.b d5,d4 +TBLS44: subi.b #VOLMN2,d4 + add.w d4,d4 + add.w d4,d4 + movea.l (a0,d4.w),a2 * 処理アドレス + moveq #0,d3 +TBLS51: movea.l a4,a3 + move.w d1,d0 + andi.w #$0300,d0 + cmpi.w #$0100,d0 + bcc TBLS52 + swap d1 * 通常出力 + add.l a1,d2 + moveq #0,d0 + move.l d1,(a3)+ + move.l d3,(a3)+ + move.l d0,(a3)+ + swap d6 + move.w d0,(a3)+ + move.w 2+PCMMOD-WK(a6,d6.w),(a3)+ + lea.l $40(a5),a0 + move.l a0,(a3)+ + move.l d0,(a3)+ + move.l d7,(a3)+ + move.l a1,(a3)+ + lea DPCMBF-WK(a6),a0 + move.l (a0,d6.w),(a3)+ + move.l d4,(a3)+ + move.l d2,(a3)+ + move.l a2,(a3)+ + move.l a1,(a3)+ + move.l a1,(a3)+ + move.l a1,(a3)+ + move.l d2,(a3)+ + move.l d0,(a3)+ + move.l d0,(a3)+ + move.l d0,(a3)+ + move.l d0,(a3)+ + move.b PCMMOD-WK(a6,d6.w),(a3)+ + move.b #64,(a3)+ + move.w #64*64,(a3)+ + move.b #64,(a3)+ + move.b d0,(a3)+ + move.w d0,(a3)+ +TBLSEE: move.w sr,-(sp) + ori.w #$0700,sr + movem.l (a4),d0-d7/a0-a2 + movem.l d0-d7/a0-a2,(a5) + movem.l 44(a4),d0-d7/a0-a2 + movem.l d0-d7/a0-a2,44(a5) + move.w (sp)+,sr +TBLSE1: lea CHNSIZ(sp),sp + movem.l (sp)+,d0-d7/a0-a4 + rts + +TBLS5X: tas (a5) * チャンネル停止 + bra TBLSE1 + +TBLS52: bne TBLS53 + subq.w #1,d2 * アレイチェーン出力 + bmi TBLS5X + move.l a1,d0 + andi.w #1,d0 + bne TBLS521 + swap d1 + moveq #0,d0 + move.l d1,(a3)+ + move.l d3,(a3)+ + move.l d0,(a3)+ + swap d6 + move.w d2,(a3)+ + move.w 2+PCMMOD-WK(a6,d6.w),(a3)+ + moveq #6,d1 + add.l a1,d1 + move.l d1,(a3)+ + move.l d0,(a3)+ + move.l d7,(a3)+ + move.l (a1)+,d3 + cmpi.b #4,d6 + bne TBLS522 + btst #0,d3 + beq TBLS522 + tas (a4) +TBLS522: + move.l d3,(a3)+ + lea DPCMBF-WK(a6),a0 + move.l (a0,d6.w),(a3)+ + move.l d4,(a3)+ + moveq #0,d2 + move.w (a1)+,d2 + cmpi.b #4,d6 + bne TBLS523 + btst #0,d2 + beq TBLS523 + tas (a4) +TBLS523: + add.l d3,d2 + move.l d2,(a3)+ + move.l a2,(a3)+ + move.l d3,(a3)+ + move.l d3,(a3)+ + move.l d3,(a3)+ + move.l d2,(a3)+ + move.l d0,(a3)+ + move.l d0,(a3)+ + move.l d0,(a3)+ + move.l d0,(a3)+ + move.b PCMMOD-WK(a6,d6.w),(a3)+ + move.b #64,(a3)+ + move.w #64*64,(a3)+ + move.b #64,(a3)+ + move.b d0,(a3)+ + move.w d0,(a3)+ + cmp.l d2,d3 + bne TBLSEE + tas (a4) + bra TBLSEE + +TBLS521: + ori.w #$8000,d1 + swap d1 + moveq #0,d0 + move.l d1,(a3)+ + move.l d3,(a3)+ + move.l d0,(a3)+ + swap d6 + move.w d0,(a3)+ + move.w 2+PCMMOD-WK(a6,d6.w),(a3)+ + lea $40(a5),a0 + move.l a0,(a3)+ + move.l d0,(a3)+ + move.l d7,(a3)+ + move.l d0,(a3)+ + lea DPCMBF-WK(a6),a0 + move.l (a0,d6.w),(a3)+ + move.l d4,(a3)+ + move.l d0,(a3)+ + move.l a2,(a3)+ + move.l d3,(a3)+ + move.l d3,(a3)+ + move.l d3,(a3)+ + move.l d2,(a3)+ + move.l d0,(a3)+ + move.l d0,(a3)+ + move.l d0,(a3)+ + move.l d0,(a3)+ + move.b PCMMOD-WK(a6,d6.w),(a3)+ + move.b #64,(a3)+ + move.w #64*64,(a3)+ + move.b #64,(a3)+ + move.b d0,(a3)+ + move.w d0,(a3)+ + bra TBLSEE + +TBLS53: move.l a1,d0 * リンクアレイチェーン出力 + andi.w #1,d0 + bne TBLS521 + swap d1 + moveq #0,d0 + move.l d1,(a3)+ + move.l d3,(a3)+ + move.l d0,(a3)+ + swap d6 + move.w d0,(a3)+ + move.w 2+PCMMOD-WK(a6,d6.w),(a3)+ + moveq #6,d1 + add.l a1,d1 + move.l d1,(a3)+ + move.l d0,(a3)+ + move.l d7,(a3)+ + move.l (a1)+,d3 + cmpi.b #4,d6 + bne TBLS532 + btst #0,d3 + beq TBLS532 + tas (a4) +TBLS532: + move.l d3,(a3)+ + lea DPCMBF-WK(a6),a0 + move.l (a0,d6.w),(a3)+ + move.l d4,(a3)+ + moveq #0,d2 + move.w (a1)+,d2 + cmpi.b #4,d6 + bne TBLS533 + btst #0,d3 + beq TBLS533 + tas (a4) +TBLS533: + add.l d3,d2 + move.l d2,(a3)+ + move.l a2,(a3)+ + move.l d3,(a3)+ + move.l d3,(a3)+ + move.l d3,(a3)+ + move.l d2,(a3)+ + move.l d0,(a3)+ + move.l d0,(a3)+ + move.l d0,(a3)+ + move.l d0,(a3)+ + move.b PCMMOD-WK(a6,d6.w),(a3)+ + move.b #64,(a3)+ + move.w #64*64,(a3)+ + move.b #64,(a3)+ + move.b d0,(a3)+ + move.w d0,(a3)+ + cmp.l d2,d3 + bne TBLSEE + tas (a4) + bra TBLSEE + +PANSET: movem.l d0-d1,-(sp) * 定位設定 + cmpi.b #4,d1 + bcc PANSE3 + move.b PANWK-WK(a6),d0 + tst.w PANFLG-WK(a6) + bne PANSE1 + moveq #3,d0 + and.b PPIPC,d0 + move.b PANTBL(pc,d0.w),d0 + move.b d0,PANWK-WK(a6) +PANSE1: cmp.b d0,d1 + beq PANSE3 + move.w sr,-(sp) + ori.w #$0700,sr + move.b d1,PANWK-WK(a6) + not.b d1 + moveq #1,d0 + lsr.b #1,d1 + addx.b d0,d0 + move.b d0,PANWK1-WK(a6) + moveq #0,d0 + lsr.b #1,d1 + addx.b d0,d0 + move.b d0,PANWK1+1-WK(a6) + bset #4,PANFLG-WK(a6) + move.w (sp)+,sr +PANSE3: movem.l (sp)+,d0-d1 + rts + +PANTBL: .dc.b 3,1,2,0 + +PANCNG: move.w d0,-(sp) * 定位変更 + move.w sr,-(sp) + ori.w #$0700,sr + move.w PANWK1-WK(a6),d0 + move.w d0,PANWK2-WK(a6) + move.w d0,PANWK3-WK(a6) + move.b d0,PPICTL + rol.w #8,d0 + move.b d0,PPICTL + sf PANFLG-WK(a6) + move.w (sp)+,sr + move.w (sp)+,d0 + rts + +FRQSE0: movem.l d0-d2/a0,-(sp) * 周波数モード自動判別時エントリ + bra FRQSE1 + +FRQSET: movem.l d0-d2/a0,-(sp) * 再生周波数設定 + cmpi.b #7,d0 + bcc FRQSEE + movea.l FRQPTR-WK(a6),a0 + ext.w d0 + move.b (a0,d0.w),d0 + btst #6,d0 + bne FRQSEE +FRQSE1: move.w sr,-(sp) + moveq #$0C,d1 + ori.w #$0700,sr + and.b PPIPC,d1 + lsr.b #2,d1 + move.b FM1BBF.w,d2 + bpl FRQSE2 + tas d1 +FRQSE2: eor.b d0,d1 + beq FRQSE6 + bpl FRQSE5 +FRQSE3: tst.b FMDAT + bmi FRQSE3 + move.b #$1B,FMADR + andi.b #$7F,d2 + tst.b d0 + bpl FRQSE4 + tas d2 +FRQSE4: tst.b FMDAT + bmi FRQSE4 + move.b d2,FMDAT + move.b d2,FM1BBF.w +FRQSE5: andi.b #3,d1 + beq FRQSE6 + moveq #2,d1 + lsr.b #1,d0 + addx.b d1,d1 + move.b d1,PPICTL + moveq #3,d1 + lsr.b #1,d0 + addx.b d1,d1 + move.b d1,PPICTL +FRQSE6: move.w (sp)+,sr +FRQSEE: movem.l (sp)+,d0-d2/a0 + rts + +FRQCAL: movem.l d1-d6/a0,-(sp) + moveq #0,d5 + moveq #0,d6 + move.w d0,d5 + moveq #1,d0 + swap d0 + cmp.w d5,d1 + beq FRQC01 + moveq #0,d0 + moveq #1,d6 + tst.w d5 + beq FRQCEN + tst.w d1 + beq FRQCEN + divu.w d1,d5 + move.w d5,d0 + swap d0 + cmpi.l #$10000,d5 + bcs FRQC01 + move.w #$8000,d5 + divu.w d1,d5 + move.w d5,d0 +FRQC01: moveq #1,d1 + swap d1 + sub.w d3,d2 + beq FRQC20 + bcs FRQC10 + ori.b #2,d6 + ext.l d2 + divu.w #12*64,d2 + move.l d2,d3 + swap d3 + add.w d3,d3 + beq FRQC02 + lea FRQCTB(pc),a0 + move.w (a0,d3.w),d1 +FRQC02: lsl.l d2,d1 + bra FRQC20 + +FRQC10: ori.b #2,d6 + neg.w d2 + ext.l d2 + divu.w #12*64,d2 + move.l d2,d3 + swap d3 + neg.w d3 + beq FRQC12 + addq.w #1,d2 + addi.w #12*64,d3 + add.w d3,d3 + lea FRQCTB(pc),a0 + move.w (a0,d3.w),d1 +FRQC12: lsr.l d2,d1 +FRQC20: cmpi.b #2,d6 + bcs FRQCEN + beq FRQC30 + move.l d0,d3 + move.w d0,d2 + mulu.w d1,d2 + swap d0 + mulu.w d1,d0 + swap d1 + move.w d3,d5 + mulu.w d1,d5 + swap d3 + mulu.w d1,d3 + clr.w d2 + swap d2 + add.l d2,d0 + add.l d5,d0 + swap d3 + clr.w d3 + add.l d3,d0 +FRQCEN: movem.l (sp)+,d1-d6/a0 + tst.l d0 + rts + +FRQC30: move.l d1,d0 + bra FRQCEN + +FRQADP: movem.l d1-d2/a0,-(sp) + lea PCMXTB(pc),a0 +FRQAD1: movem.l (a0)+,d1-d2 + cmp.l d1,d0 + bcs FRQAD1 + move.l d2,d0 + movem.l (sp)+,d1-d2/a0 + rts + + .dc.w 0 * 4バイト境界調整用 *;dummy + +* 音程変換用テーブル +* 以下の値は 65536*(2^(n/768)-1) の解を四捨五入したもの (n=0~767) +FRQCTB: .dc.w $0000,$003B,$0076,$00B2,$00ED,$0128,$0164,$019F + .dc.w $01DB,$0217,$0252,$028E,$02CA,$0305,$0341,$037D + .dc.w $03B9,$03F5,$0431,$046E,$04AA,$04E6,$0522,$055F + .dc.w $059B,$05D8,$0614,$0651,$068D,$06CA,$0707,$0743 + .dc.w $0780,$07BD,$07FA,$0837,$0874,$08B1,$08EF,$092C + .dc.w $0969,$09A7,$09E4,$0A21,$0A5F,$0A9C,$0ADA,$0B18 + .dc.w $0B56,$0B93,$0BD1,$0C0F,$0C4D,$0C8B,$0CC9,$0D07 + .dc.w $0D45,$0D84,$0DC2,$0E00,$0E3F,$0E7D,$0EBC,$0EFA + .dc.w $0F39,$0F78,$0FB6,$0FF5,$1034,$1073,$10B2,$10F1 + .dc.w $1130,$116F,$11AE,$11EE,$122D,$126C,$12AC,$12EB + .dc.w $132B,$136B,$13AA,$13EA,$142A,$146A,$14A9,$14E9 + .dc.w $1529,$1569,$15AA,$15EA,$162A,$166A,$16AB,$16EB + .dc.w $172C,$176C,$17AD,$17ED,$182E,$186F,$18B0,$18F0 + .dc.w $1931,$1972,$19B3,$19F5,$1A36,$1A77,$1AB8,$1AFA + .dc.w $1B3B,$1B7D,$1BBE,$1C00,$1C41,$1C83,$1CC5,$1D07 + .dc.w $1D48,$1D8A,$1DCC,$1E0E,$1E51,$1E93,$1ED5,$1F17 + .dc.w $1F5A,$1F9C,$1FDF,$2021,$2064,$20A6,$20E9,$212C + .dc.w $216F,$21B2,$21F5,$2238,$227B,$22BE,$2301,$2344 + .dc.w $2388,$23CB,$240E,$2452,$2496,$24D9,$251D,$2561 + .dc.w $25A4,$25E8,$262C,$2670,$26B4,$26F8,$273D,$2781 + .dc.w $27C5,$280A,$284E,$2892,$28D7,$291C,$2960,$29A5 + .dc.w $29EA,$2A2F,$2A74,$2AB9,$2AFE,$2B43,$2B88,$2BCD + .dc.w $2C13,$2C58,$2C9D,$2CE3,$2D28,$2D6E,$2DB4,$2DF9 + .dc.w $2E3F,$2E85,$2ECB,$2F11,$2F57,$2F9D,$2FE3,$302A + .dc.w $3070,$30B6,$30FD,$3143,$318A,$31D0,$3217,$325E + .dc.w $32A5,$32EC,$3332,$3379,$33C1,$3408,$344F,$3496 + .dc.w $34DD,$3525,$356C,$35B4,$35FB,$3643,$368B,$36D3 + .dc.w $371A,$3762,$37AA,$37F2,$383A,$3883,$38CB,$3913 + .dc.w $395C,$39A4,$39ED,$3A35,$3A7E,$3AC6,$3B0F,$3B58 + .dc.w $3BA1,$3BEA,$3C33,$3C7C,$3CC5,$3D0E,$3D58,$3DA1 + .dc.w $3DEA,$3E34,$3E7D,$3EC7,$3F11,$3F5A,$3FA4,$3FEE + .dc.w $4038,$4082,$40CC,$4116,$4161,$41AB,$41F5,$4240 + .dc.w $428A,$42D5,$431F,$436A,$43B5,$4400,$444B,$4495 + .dc.w $44E1,$452C,$4577,$45C2,$460D,$4659,$46A4,$46F0 + .dc.w $473B,$4787,$47D3,$481E,$486A,$48B6,$4902,$494E + .dc.w $499A,$49E6,$4A33,$4A7F,$4ACB,$4B18,$4B64,$4BB1 + .dc.w $4BFE,$4C4A,$4C97,$4CE4,$4D31,$4D7E,$4DCB,$4E18 + .dc.w $4E66,$4EB3,$4F00,$4F4E,$4F9B,$4FE9,$5036,$5084 + .dc.w $50D2,$5120,$516E,$51BC,$520A,$5258,$52A6,$52F4 + .dc.w $5343,$5391,$53E0,$542E,$547D,$54CC,$551A,$5569 + .dc.w $55B8,$5607,$5656,$56A5,$56F4,$5744,$5793,$57E2 + .dc.w $5832,$5882,$58D1,$5921,$5971,$59C1,$5A10,$5A60 + .dc.w $5AB0,$5B01,$5B51,$5BA1,$5BF1,$5C42,$5C92,$5CE3 + .dc.w $5D34,$5D84,$5DD5,$5E26,$5E77,$5EC8,$5F19,$5F6A + .dc.w $5FBB,$600D,$605E,$60B0,$6101,$6153,$61A4,$61F6 + .dc.w $6248,$629A,$62EC,$633E,$6390,$63E2,$6434,$6487 + .dc.w $64D9,$652C,$657E,$65D1,$6624,$6676,$66C9,$671C + .dc.w $676F,$67C2,$6815,$6869,$68BC,$690F,$6963,$69B6 + .dc.w $6A0A,$6A5E,$6AB1,$6B05,$6B59,$6BAD,$6C01,$6C55 + .dc.w $6CAA,$6CFE,$6D52,$6DA7,$6DFB,$6E50,$6EA4,$6EF9 + .dc.w $6F4E,$6FA3,$6FF8,$704D,$70A2,$70F7,$714D,$71A2 + .dc.w $71F7,$724D,$72A2,$72F8,$734E,$73A4,$73FA,$7450 + .dc.w $74A6,$74FC,$7552,$75A8,$75FF,$7655,$76AC,$7702 + .dc.w $7759,$77B0,$7807,$785E,$78B4,$790C,$7963,$79BA + .dc.w $7A11,$7A69,$7AC0,$7B18,$7B6F,$7BC7,$7C1F,$7C77 + .dc.w $7CCF,$7D27,$7D7F,$7DD7,$7E2F,$7E88,$7EE0,$7F38 + .dc.w $7F91,$7FEA,$8042,$809B,$80F4,$814D,$81A6,$81FF + .dc.w $8259,$82B2,$830B,$8365,$83BE,$8418,$8472,$84CB + .dc.w $8525,$857F,$85D9,$8633,$868E,$86E8,$8742,$879D + .dc.w $87F7,$8852,$88AC,$8907,$8962,$89BD,$8A18,$8A73 + .dc.w $8ACE,$8B2A,$8B85,$8BE0,$8C3C,$8C97,$8CF3,$8D4F + .dc.w $8DAB,$8E07,$8E63,$8EBF,$8F1B,$8F77,$8FD4,$9030 + .dc.w $908C,$90E9,$9146,$91A2,$91FF,$925C,$92B9,$9316 + .dc.w $9373,$93D1,$942E,$948C,$94E9,$9547,$95A4,$9602 + .dc.w $9660,$96BE,$971C,$977A,$97D8,$9836,$9895,$98F3 + .dc.w $9952,$99B0,$9A0F,$9A6E,$9ACD,$9B2C,$9B8B,$9BEA + .dc.w $9C49,$9CA8,$9D08,$9D67,$9DC7,$9E26,$9E86,$9EE6 + .dc.w $9F46,$9FA6,$A006,$A066,$A0C6,$A127,$A187,$A1E8 + .dc.w $A248,$A2A9,$A30A,$A36B,$A3CC,$A42D,$A48E,$A4EF + .dc.w $A550,$A5B2,$A613,$A675,$A6D6,$A738,$A79A,$A7FC + .dc.w $A85E,$A8C0,$A922,$A984,$A9E7,$AA49,$AAAC,$AB0E + .dc.w $AB71,$ABD4,$AC37,$AC9A,$ACFD,$AD60,$ADC3,$AE27 + .dc.w $AE8A,$AEED,$AF51,$AFB5,$B019,$B07C,$B0E0,$B145 + .dc.w $B1A9,$B20D,$B271,$B2D6,$B33A,$B39F,$B403,$B468 + .dc.w $B4CD,$B532,$B597,$B5FC,$B662,$B6C7,$B72C,$B792 + .dc.w $B7F7,$B85D,$B8C3,$B929,$B98F,$B9F5,$BA5B,$BAC1 + .dc.w $BB28,$BB8E,$BBF5,$BC5B,$BCC2,$BD29,$BD90,$BDF7 + .dc.w $BE5E,$BEC5,$BF2C,$BF94,$BFFB,$C063,$C0CA,$C132 + .dc.w $C19A,$C202,$C26A,$C2D2,$C33A,$C3A2,$C40B,$C473 + .dc.w $C4DC,$C544,$C5AD,$C616,$C67F,$C6E8,$C751,$C7BB + .dc.w $C824,$C88D,$C8F7,$C960,$C9CA,$CA34,$CA9E,$CB08 + .dc.w $CB72,$CBDC,$CC47,$CCB1,$CD1B,$CD86,$CDF1,$CE5B + .dc.w $CEC6,$CF31,$CF9C,$D008,$D073,$D0DE,$D14A,$D1B5 + .dc.w $D221,$D28D,$D2F8,$D364,$D3D0,$D43D,$D4A9,$D515 + .dc.w $D582,$D5EE,$D65B,$D6C7,$D734,$D7A1,$D80E,$D87B + .dc.w $D8E9,$D956,$D9C3,$DA31,$DA9E,$DB0C,$DB7A,$DBE8 + .dc.w $DC56,$DCC4,$DD32,$DDA0,$DE0F,$DE7D,$DEEC,$DF5B + .dc.w $DFC9,$E038,$E0A7,$E116,$E186,$E1F5,$E264,$E2D4 + .dc.w $E343,$E3B3,$E423,$E493,$E503,$E573,$E5E3,$E654 + .dc.w $E6C4,$E735,$E7A5,$E816,$E887,$E8F8,$E969,$E9DA + .dc.w $EA4B,$EABC,$EB2E,$EB9F,$EC11,$EC83,$ECF5,$ED66 + .dc.w $EDD9,$EE4B,$EEBD,$EF2F,$EFA2,$F014,$F087,$F0FA + .dc.w $F16D,$F1E0,$F253,$F2C6,$F339,$F3AD,$F420,$F494 + .dc.w $F507,$F57B,$F5EF,$F663,$F6D7,$F74C,$F7C0,$F834 + .dc.w $F8A9,$F91E,$F992,$FA07,$FA7C,$FAF1,$FB66,$FBDC + .dc.w $FC51,$FCC7,$FD3C,$FDB2,$FE28,$FE9E,$FF14,$FF8A + +VOLCTB: .dc.b $6B,$6C,$6C,$6D,$6D,$6D,$6E,$6E * 音量変換用テーブル + .dc.b $6F,$6F,$6F,$6F,$70,$70,$70,$71 + .dc.b $71,$71,$72,$72,$72,$73,$73,$73 + .dc.b $74,$74,$75,$75,$75,$76,$76,$76 + .dc.b $76,$77,$77,$77,$78,$78,$78,$78 + .dc.b $79,$79,$79,$7A,$7A,$7A,$7B,$7B + .dc.b $7B,$7B,$7C,$7C,$7C,$7C,$7D,$7D + .dc.b $7D,$7E,$7E,$7E,$7F,$7F,$7F,$80 + .dc.b $80,$80,$80,$81,$81,$81,$82,$82 + .dc.b $82,$82,$83,$83,$83,$83,$84,$84 + .dc.b $84,$85,$85,$85,$86,$86,$86,$87 + .dc.b $87,$87,$88,$88,$88,$89,$89,$89 + .dc.b $8A,$8A,$8A,$8A,$8B,$8B,$8B,$8C + .dc.b $8C,$8C,$8D,$8D,$8D,$8E,$8E,$8E + .dc.b $8F,$8F,$8F,$90,$90,$90,$91,$91 + .dc.b $91,$92,$92,$92,$93,$93,$93,$94 + +VOLCT1: .dc.b $6B,$6C,$6C,$6D,$6D,$6D,$6E,$6E * デフォルトの音量変換用テーブル + .dc.b $6F,$6F,$6F,$6F,$70,$70,$70,$71 + .dc.b $71,$71,$72,$72,$72,$73,$73,$73 + .dc.b $74,$74,$75,$75,$75,$76,$76,$76 + .dc.b $76,$77,$77,$77,$78,$78,$78,$78 + .dc.b $79,$79,$79,$7A,$7A,$7A,$7B,$7B + .dc.b $7B,$7B,$7C,$7C,$7C,$7C,$7D,$7D + .dc.b $7D,$7E,$7E,$7E,$7F,$7F,$7F,$80 + .dc.b $80,$80,$80,$81,$81,$81,$82,$82 + .dc.b $82,$82,$83,$83,$83,$83,$84,$84 + .dc.b $84,$85,$85,$85,$86,$86,$86,$87 + .dc.b $87,$87,$88,$88,$88,$89,$89,$89 + .dc.b $8A,$8A,$8A,$8A,$8B,$8B,$8B,$8C + .dc.b $8C,$8C,$8D,$8D,$8D,$8E,$8E,$8E + .dc.b $8F,$8F,$8F,$90,$90,$90,$91,$91 + .dc.b $91,$92,$92,$92,$93,$93,$93,$94 + +VOLCT2: .dc.w 0, 0, 0, 1, 1, 1, 1, 1 * 音量テーブル + .dc.w 1, 1, 1, 2, 2, 2, 2, 3 + .dc.w 3, 3, 4, 4, 5, 5, 6, 6 + .dc.w 7, 8, 9, 9, 10, 12, 13, 14 + .dc.w 15, 17, 19, 21, 23, 25, 28, 31 + .dc.w 34, 37, 41, 45, 50, 55, 60, 66 + .dc.w 73, 80, 88, 97, 107, 118, 130, 143 + .dc.w 157, 173, 190, 209, 230, 253, 279, 307 + .dc.w 337, 371, 408, 449, 494, 543, 598, 658 + .dc.w 724, 796, 876, 963,1060,1166,1282,1410 + .dc.w 1551,1707,1877,2065,2272,2499,2749,3024 + .dc.w 3326,3659,4025,4427,4870,5357,5893,6482 + .dc.w 7131 + + .dc.w 0,0,0 * 4バイト境界調整用 *;dummy + +PCMXTB: .dc.l $00040000,AD20 * ADPCM音程変換ルーチンテーブル + .dc.l $00020005,AD10 + .dc.l $0001FFFC,ADM1 + .dc.l $00010005,AD00 + .dc.l $0000FFFC,ADM0 + .dc.l $00008005,ADA0 + .dc.l $00007FFC,ADMA + .dc.l $00000000,ADB0 + +FRQTBL: .dc.b $80,$81,$00,$01,$02,$40,$40,$40 * -M0 + .dc.b $40,$40,$00,$01,$02,$81,$82,$40 * -M1 + .dc.b $80,$81,$00,$01,$02,$83,$82,$40 * -M2 + .dc.b $80,$81,$00,$01,$02,$03,$83,$40 * -M3 + .dc.b $80,$81,$00,$01,$02,$83,$03,$40 * -M4 + +PCMXT2: .dcb.l VOLMX2-VOLMN2+1,0 * 16bitPCM音量変換ルーチンテーブル + +PCMXT3: .dcb.l VOLMX2-VOLMN2+1,0 * 8bitPCM音量変換ルーチンテーブル + +*-------------------------------------------------------------------- +* ワークエリア + +FRQPTR: .dc.l FRQTBL * 周波数テーブルアドレス +BFADR1: .dc.w 0 * ADPCM出力バッファアドレス +PCMCHN: .dc.w PCMCI1 * チャンネル数(最大250) +PCMCMX: .dc.w PCMCI2 * 〃 の最大 +PCMFLG: .dc.w 0 * バイト数変更フラグ +PCMFL2: .dc.w 0 * バイト数変更フラグ +PCMBN0: .dc.w PCMBI1/12 +PCMBN1: .dc.w PCMBI1/12 +PCMBNX: .dc.w PCMBI2/12 +PCMBL0: .dc.w PCMBI1 * 1回に処理するバイト数ADPCM→DPCM用 +PCMBL1: .dc.w PCMBI1 * 〃 〃 +PCMBMX: .dc.w PCMBI2 * 〃 の最大 +PCMBR0: .dc.w PCMBI1 * 1回に処理するバイト数DPCM→ADPCM用 +PCMBR1: .dc.w PCMBI1 * 〃 〃 +PCMBR2: .dc.w PCMBI1 * 〃 〃 +VOLMN0: .dc.w VOLMN1 * 音量指定最小値 +VOLMX0: .dc.w VOLMX1 * 音量指定最大値 +VOLMIN: .dc.w VOLMN2 * 音量指定最小値 +VOLMAX: .dc.w VOLMX2 * 音量指定最大値 +OUTOF1: .dc.w 0 * 直前のPCMデータ +PCMOFS: .dc.w 0 * DPCM誤差:変換時D0に入る +PCMTBL: .dc.l 0 * DPCM→ADPCM変換テーブルアドレス1(ワーク):変換時A2に入る +TBLAD3: .dc.l 0 * DPCM→ADPCM変換テーブルアドレス2:変換時A3に入る +TBLAD1: .dc.l 0 * ADPCM→DPCM変換テーブルアドレス情報(初期値,アドレスそのものではない) +TBLAD2: .dc.l 0 * DPCM→ADPCM変換テーブルアドレス1(初期値) +INTWK: .dc.l $FBFFDF00 * 割り込みレベル/マスク +M1LEN: .dc.l 0 * 単音再生モードデータ長さ +M1ADR: .dc.l 0 * 〃  アドレス +INTWK2: .dc.w $FDFF * 割り込みマスク中の割り込みレベル +PANFLG: .dc.w 0 * 定位変更フラグ +PANWK1: .dc.w $0301 * 定位変更ワーク1 +PANWK2: .dc.w $0301 * 〃 2 +PANWK3: .dc.w $0301 * 〃 3 + +FRQMOD: .dc.b 0 * 周波数切り替えモード(0:4M/8M,1:16M/8M,2~4:4M/8M/16M) +FRQSEL: .dc.b 4 * 基準周波数(0~6)→($01F7CALL READ時:4~7,0~2) + +DPCMBF: .dc.l 0 * DPCMバッファアドレス +PCMBU1: .dc.l 0 * 16ビットPCM用バッファアドレス +PCMBU2: .dc.l 0 * 8ビットPCM用バッファアドレス + +ADPBF1: .dc.l 0 * ADPCMバッファ1アドレス +ADPBF2: .dc.l 0 * 〃 2 〃 +ADPBFX: .dc.l 0 * ADPCMダミーデータアドレス +CHNWK: .dc.l 0 * チャンネルワークアドレス +KEPBUF: .dc.l T1KBUF * 占有バッファアドレス + +FREQ: .dc.w 3906,5208,7812,10416,15625,20833,31250 * 周波数 +FREQ1: .dc.w 3, 4, 6, 8, 12, 16, 24 * 処理バイト数の単位 + +* 下のテーブルアドレスへの変換用 +PCMMD2: .dc.b $00,$04,$08,$00 + +* ADPCM 16bitPCM 8bitPCM +PCMMOD: .dc.l $FF00001E,$0100801F,$0200001F +PCMINI: .dc.l 0,$10000,$20000 + +* PCM8 音量テーブル (0~15) $xx(a6,xn)でアクセス +PCMXT4: .dc.b $6B,$6F,$71,$74,$76,$79,$7B,$7D + .dc.b $80,$82,$84,$87,$8A,$8C,$8F,$91 + +WK: * ワークエリア/テーブルアクセス用基準ポイント(A6) +ADPBFL: .dc.b $00 * 動作制御フラグ + * ビット 機能 + * 7 DPCM→ADPCM変換オフセット初期化 + * 3 動作開始要求フラグ + * 2 オーバーランフラグ + * 1 過負荷フラグ + * 0 DPCMデータ有効フラグ,出力中フラグ(単音再生モード) +ACTFLG: .dc.b 0 * 動作チャンネル数 +DSPFLG: .dc.b 0 * 動作状況表示フラグ(trap #2 設定用) +ENDFLG: .dc.b 0 * 割り込み処理中フラグ +SKPFLG: .dc.b 0 * 一時停止フラグ +KEEPFL: .dc.b 0 * 占有フラグ +IOCHN: .dc.b PCMIOC * IOCSチャンネル数 +IOCHMX: .dc.b $FF * 最大IOCSチャンネル数($FFなら最大チャンネル数と同じ) +IOCHNW: .dc.b $FF * IOCS動作チャンネル番号($FFならチャンネル未定) +SYSFLG: .dc.b 0 * システム状態フラグ + * ビット 機能 + * 7 単音再生モード(ビット6,5のOR) + * 6 単音再生モード(trap #2 設定) + * 5 単音再生モード(コマンドライン設定) + * 4 IOCS単音モード + * 2 音量固定モード(trap #2 設定) + * 1 音量固定モード(コマンドライン設定) + * 0 デバイスドライバモード +PANWK: .dc.b 0 * 定位(0~3) +TRYWK: .dc.b 0 * 過負荷リトライカウンタ +M1MOD: .dc.b 0 * 単音再生モードフラグ(0:チェーン無し,1:アレイチェーン,2:リンクアレイチェーン) +IOFLG: .dc.b 0 * IOCS一時停止フラグ + +* ADPCM/PCMモードチェックテーブル $xx(a6,xn)でアクセス +MODTBL: .dc.b $00,$01,$02,$03,$04,$84,$C4,$05 + .dc.b $85,$C5,$06,$86,$C6,$FF,$FF,$FF + .dc.b $80,$81,$82,$83,$84,$85,$86,$FF + .dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF + .dc.b $C0,$C1,$C2,$C3,$C4,$C5,$C6,$FF + .dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF + .dc.b $00,$01,$02,$03,$04,$05,$06,$FF + .dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF + + .even + +VECTBL: .dc.w T2VECT * ベクタ用テーブル(ベクタ番号) + .dc.l T2ENT,-2 * (処理先,前の値の保存用) +VECTB1: .dc.w T1VECT + .dc.l T1ENT,-2 + .dc.w $006A + .dc.l INTEXE,-2 + .dc.w $006B + .dc.l INTEXE,-2 + .dc.w $0160 + .dc.l IOCS60,-2 + .dc.w $0161 + .dc.l IOCS61,-2 + .dc.w $0162 + .dc.l IOCS62,-2 + .dc.w $0163 + .dc.l IOCS63,-2 + .dc.w $0164 + .dc.l IOCS64,-2 + .dc.w $0165 + .dc.l IOCS65,-2 + .dc.w $0166 + .dc.l IOCS66,-2 + .dc.w $0167 + .dc.l IOCS67,-2 + .dc.w 0 + .dc.l TOPADR + +* 各種バッファのあるアドレス(実際のアドレスとMALLOCで確保した先頭アドレス) +WKADF1: .dc.w 0 * PCMバッファ分離フラグ +WKADR1: .dc.l -2,-2 * 〃 先頭アドレス +WKADF2: .dc.w 0 * ADPCMバッファ分離フラグ +WKADR2: .dc.l -2,-2 * 〃 先頭アドレス +WKADF3: .dc.w 0 * チャンネルワーク分離フラグ +WKADR3: .dc.l -2,-2 * 〃 先頭アドレス +WKADF4: .dc.w 0 * PCM→ADPCM変換テーブル分離フラグ +WKADR4: .dc.l -2,-2 * 〃 先頭アドレス +WKADF5: .dc.w 0 * ADPCM→PCM変換テーブル分離フラグ +WKADR5: .dc.l -2,-2 * 〃 先頭アドレス + +*-------------------------------------------------------------------- + + .dc.w 0,0,0 * 4バイト境界調整用 *;dummy + +INTOP2: move.b #$01,PCMCNT + sf ADIOCS.w + rte + +INTOP1: btst #2,ADIOCS.w + bne INTOP2 + move.b #PCMSP1,PCMDAT * 終了 + rte + +INTOPR: move.b DMACH3,DMACH3 * 多重割り込み対策 + bmi INTOP1 + rte + +DISPON: move.w #DCOL1,TXTPL0 * 動作状態表示ON + bra INTEXA + +* .dc.w 0 * 4バイト境界調整用 *;dummy + +* 割り込み処理エントリ (エラー時と共通) + +INTEXE: ori.w #$0700,sr + tas ENDFLG + bne INTOPR + movem.l d5-d7/a5-a6,-(sp) + lea WK(pc),a6 + lea DMACH3,a5 + movep.w MFPIMA-DMACH3(a5),d7 * 割り込みマスク + move.w INTWK+2-WK(a6),d5 + and.w d7,d5 + eor.w d5,d7 + movep.w d5,MFPIMA-DMACH3(a5) + tst.b (a5) + move.w sr,d6 + move.w d6,d5 + and.w INTWK2-WK(a6),d5 + move.w d5,sr + + move.b DSPFLG-WK(a6),-(sp) + bmi DISPON +INTEXA: + move.w d7,-(sp) + movem.l d0-d4/a0-a4,-(sp) + movem.w d5-d6,-(sp) + + cmpi.b #PCM8FL,ADIOCS.w + bne IN0000 + tst.b SYSFLG-WK(a6) + bmi IN0000 + + move.w d6,sr + move.b (a5),d0 + st (a5) + bmi INTHLT + cmpi.b #$40,d0 + bcs INT999 + moveq #9,d0 + and.b (a6),d0 + beq INTCNT +INT001: andi.b #$F3,(a6) + move.w d5,sr + + tst.b SKPFLG-WK(a6) * 一時停止中ならスキップ + bne INT991 + +INT010: move.w d6,sr +INT011: lsl.w PANFLG-WK(a6) * 定位変更 + beq INT013 + bpl INT012 + lea PPICTL,a0 + move.b PANWK3-WK(a6),(a0) + move.b PANWK3+1-WK(a6),(a0) +INT012: move.l PANWK1-WK(a6),PANWK2-WK(a6) +INT013: + + lsl.w PCMFLG-WK(a6) * 処理バイト数変更 + beq INT022 + move.w PCMBN0-WK(a6),PCMBN1-WK(a6) + move.w PCMBL0-WK(a6),PCMBL1-WK(a6) + move.l PCMBR0-WK(a6),PCMBR1-WK(a6) +INT022: move.w d5,sr + + move.w BFADR1-WK(a6),d4 + movea.l ADPBF1-WK(a6,d4.w),a4 + move.w PCMBR2-WK(a6),d3 + movea.l ADPBFX-WK(a6),a3 + movea.l a3,a0 + + move.w d6,sr +INT030: btst #3,(a5) + beq INT033 + btst #0,(a6) + bne INT031 + tas (a6) + bra INT032 +INT031: movea.l a4,a0 +INT032: move.l a0,$1C(a5) * DMA転送アドレスセット + move.w d3,$1A(a5) + st (a5) + move.b #$48,7(a5) + btst #6,7(a5) + bne INT035 + move.w d5,sr + + movea.l a3,a0 + + move.w d6,sr +INT033: tas (a6) + move.b #$10,7(a5) * 継続起動 + st (a5) + move.w d3,$A(a5) + move.l a3,$C(a5) + btst #0,(a6) + beq INT034 + movea.l a4,a0 +INT034: move.w d3,$1A(a5) + move.l a0,$1C(a5) + move.b #$C8,7(a5) +INT035: + and.w INTWK-WK(a6),d6 * 割り込み許可 + move.w d6,sr + + eori.w #4,d4 + move.w d4,BFADR1-WK(a6) + + bclr #0,(a6) + beq INT062 +INT040: bclr #7,(a6) + beq INT041 + moveq #0,d0 * 出力オフセット初期化 + moveq #0,d1 + movem.l d0-d1,OUTOF1-WK(a6) + move.l TBLAD2-WK(a6),PCMTBL-WK(a6) +INT041: move.w PCMOFS-WK(a6),d0 * DPCM→ADPCM変換 + movea.l a4,a0 + movea.l DPCMBF-WK(a6),a1 + movem.l PCMTBL-WK(a6),a2-a3 + moveq #0,d2 + moveq #3,d1 + and.w d3,d1 + add.w d1,d1 + lsr.w #2,d3 + move.w INT0A0(pc,d1.w),d1 + jmp INT0A0(pc,d1.w) +INT0A0: .dc.w INT0A5-INT0A0,INT0A4-INT0A0,INT0A3-INT0A0,INT0A2-INT0A0 +INT0A1: PCM2AD +INT0A2: PCM2AD +INT0A3: PCM2AD +INT0A4: PCM2AD +INT0A5: dbra d3,INT0A1 + move.w d0,PCMOFS-WK(a6) + move.l a2,PCMTBL-WK(a6) +INT050: cmpi.b #4,MPUFLG.w * キャッシュ制御 + bcs INT060 +INT051: moveq #CACHEL-1,d0 * 68040以降ならキャッシュの内容を書き戻す + add.w PCMBR2-WK(a6),d0 + lsr.w #CACHES,d0 +INT052: .dc.w $F46C * cpushl dc,(a4) + lea CACHEL(a4),a4 + dbra d0,INT052 +INT060: btst #6,7(a5) * 既に予約が消えていれば,もう一度同じデータを出力 + beq INT112 +INT062: + + tst.b 3*2+10*4(sp) + bmi DISP81 +INTEXC: + + movea.l CHNWK(pc),a6 * ADPCM→DPCM変換合成+PCM合成 + bsr PCMCNV + lea DMACH3,a5 + move.b d6,ACTFLG-WK(a6) + beq INT120 +INT112: bset #0,(a6) +INT120: + + ori.w #$0700,sr * 割り込み終了処理 + + btst #0,(a6) + beq INT999 + btst #6,7(a5) + bne INT999 + movem.w (sp),d5-d6 * 過負荷時 + addq.b #1,TRYWK-WK(a6) + cmpi.b #TRYNUM,TRYWK-WK(a6) + bls INT011 + ori.b #$A,(a6) + move.b (a5),(a5) + bpl INT999 + move.b #PCMSP2,PCMDAT + +INT999: move.w (sp)+,sr + move.w (sp)+,d6 + movem.l (sp)+,d0-d4/a0-a4 + move.w (sp)+,d7 + sf TRYWK-WK(a6) + sf ENDFLG-WK(a6) + lea MFPIMA,a5 + move.w d6,sr + movep.w 0(a5),d6 + or.w d7,d6 + movep.w d6,0(a5) + tst.b (sp)+ + movem.l (sp)+,d5-d7/a5-a6 + bmi DISPOF + rte + +INT991: st (a5) + bra INT999 + +DISP81: move.w #DCOL2,TXTPL0 * 動作状態表示色変更 + bra INTEXC + +DISPOF: move.w #DCOL0,TXTPL0 * 動作状態表示OFF + rte + +INTCNT: st (a5) * 終了時1回オーバーラン + bclr #2,(a6) + bne INT999 + ori.b #$84,(a6) + move.w PCMBR2-WK(a6),$1A(a5) + move.l ADPBFX-WK(a6),$1C(a5) + move.b #$48,7(a5) + bra INT999 + +INTHLT: btst #2,ADIOCS.w + bne INTHL2 + tst.b SKPFLG-WK(a6) * 終了処理 + bne INTHL1 + bclr #3,(a6) + bne INT001 + btst #0,(a6) + bne INT001 +INTHL1: st (a5) + move.b #PCMSP1,PCMDAT + bra INT999 + +INTHL2: st (a5) + move.b #$01,PCMCNT + sf ADIOCS.w + bra INT999 + +IN0000: move.w d6,sr * 単音再生モード + move.b (a5),d0 + st (a5) + bmi IN0002 + cmpi.b #$40,d0 + bcs IN0003 + tst.b M1MOD-WK(a6) + bne IN0003 + move.l M1LEN-WK(a6),d0 * 通常 + beq INT999 + move.l #$FFF0,d1 + cmp.l d1,d0 + bcc IN0001 + move.l d0,d1 +IN0001: sub.l d1,d0 + move.l d0,M1LEN-WK(a6) + movea.l M1ADR-WK(a6),a0 + move.l a0,$1C(a5) + move.w d1,$1A(a5) + move.b #$48,7(a5) + add.l a0,d1 + move.l d1,M1ADR-WK(a6) + bra INT999 + +IN0002: cmpi.b #1,M1MOD-WK(a6) * 終了 + bcc IN0010 +IN0003: btst #2,ADIOCS.w + bne IN0004 + bclr #0,(a6) + move.b #PCMSP1,PCMDAT + sf ADIOCS.w + bra INT999 + +IN0004: move.b #$01,PCMCNT + sf ADIOCS.w + bra INT999 + +IN0010: sf M1MOD-WK(a6) + bne IN0011 + move.w M1LEN+2-WK(a6),$1A(a5) * アレイチェーン + move.w #$3A88,d0 + bra IN0012 + +IN0011: move.w #$3E88,d0 * リンクアレイチェーン +IN0012: move.l M1ADR-WK(a6),$1C(a5) + movep.w d0,5(a5) + move.b #$02,PCMCNT + bra INT999 + +PCMBCL: movem.l d0/d3/a1,-(sp) * PCMバッファ初期化 + moveq #0,d0 + dbra d3,PCMBC1 + bra PCMBC2 +PCMBC1: move.l d0,(a1)+ + dbra d3,PCMBC1 +PCMBC2: movem.l (sp)+,d0/d3/a1 + rts + +PCMCLR: movem.l d7/a6,-(sp) * 過負荷時の処理 + moveq #-1,d1 +PCMCL1: move.w (a6),d0 + bmi PCMCL2 + cmp.b d0,d1 * 音量が最小のチャンネルを選択 + bcs PCMCL2 + move.b d0,d1 + movea.l a6,a0 +PCMCL2: lea CHNSIZ(a6),a6 + dbra d7,PCMCL1 + movem.l (sp)+,d7/a6 + addq.b #1,d1 + bcs PCMCLA + tas (a0) * 1チャンネル停止 + bra PCMCLX +PCMCLA: tas (a6) * 全チャンネル停止 + lea CHNSIZ(a6),a6 + dbra d7,PCMCLA +PCMCLX: lea WK(pc),a6 + bset #0,(a6) * 変換が完了したことにする + rts + +* IN A6.L 動作テーブル先頭アドレス (このルーチンではこの定義になる) +* OUT A6.L WK を指している (本来の定義に戻している) +* D6.W 動作チャンネル数 +* +PCMCNV: moveq #0,d7 * ADPCM → DPCM変換+合成 + move.w PCMCHN(pc),d7 + subq.w #1,d7 + moveq #0,d6 + bclr #1,ADPBFL * 過負荷 + bne PCMCLA * PCMCLRにするとしつこく(笑)なる +PCMCN1: swap d7 + move.b #$83,d7 + move.w sr,d6 + ori.w #$0700,sr * 多重割り込み対策 + and.b (a6),d7 * チャンネルの動作状態チェック + bmi PCMC0F + bne PCMC1 + andi.b #$1F,(a6) * 通常モード + movem.l 4(a6),d0-d5/a0-a4 + move.b $55(a6),d7 + move.w d6,sr + addi.w #$100,d7 + move.l d3,d6 + moveq #0,d3 + move.w PCMBL1(pc),d3 + btst d2,d7 + bne PCMC00 + adda.w -2(a4),a4 + cmpi.b #$1F,d2 + bne PCMC00 + bsr PCMBCL +PCMC00: swap d2 + movem.l d2/d6/d7/a6,-(sp) + movea.l a3,a6 + bra PCMC02 +PCMC01: movem.l d2/a5,(sp) +PCMC02: move.l a6,d2 + sub.l a0,d2 + bls PCMC03 + moveq #0,d6 + lea PCMC03(pc),a5 + jmp (a4) +PCMC03: tst.w d3 + ble PCMC07 +PCMC04: movem.l (sp),d2/a5 + tst.w d2 + ble PCMC07 + tst.l d2 + bmi PCMC05 + movea.l a6,a0 + movea.l (a5)+,a6 + dbra d2,PCMC01 + bra PCMC06 +PCMC05: movea.l a6,a0 + move.l (a5)+,d6 + btst #0,d6 + bne PCMC06 + movea.l d6,a6 + dbra d2,PCMC01 +PCMC06: movem.l d2/a5,(sp) +PCMC07: tst.w d3 + sgt d5 + movea.l a6,a3 + move.b d7,$B(sp) + movem.l (sp)+,d2/d6/d7/a6 +PCMC0X: movea.l d6,a2 * 後処理 + swap d2 + bset d2,d7 + bne PCMC0E + tst.w d3 + ble PCMC0E + adda.w -2(a4),a4 + lea PCMC0E(pc),a5 + moveq #0,d6 + jmp (a4) +PCMC0E: move.l a2,d3 + andi.b #$80,d5 + move.w sr,d6 + ori.w #$0700,sr + btst #6,(a6) + bne PCMC0F + or.b d5,(a6) + movem.l d0-d4,4(a6) + move.l a0,$1C(a6) + move.l a3,$28(a6) + move.b d7,$55(a6) +PCMC0F: move.w d6,sr + lea CHNSIZ(a6),a6 + swap d7 + subq.b #1,d7 + bcc PCMCN1 + lea WK(pc),a6 + tst.w d7 * 8/16ビットPCMの処理があったか? + bmi PCMC4 * あった場合DPCM変換を行う + swap d7 + moveq #0,d6 + move.w d7,-(sp) + move.b (sp)+,d6 * 動作チャンネル数を返す + rts + +PCMC1: cmpi.b #2,d7 + beq PCMC2 + bhi PCMC3 + andi.b #$1F,(a6) * アレイチェーンモード + movem.l 4(a6),d0-d5/a0-a4 + move.b $55(a6),d7 + move.w d6,sr + addi.w #$100,d7 + move.l d3,d6 + moveq #0,d3 + move.w PCMBL1(pc),d3 + btst d2,d7 + bne PCMC10 + adda.w -2(a4),a4 + cmpi.b #$1F,d2 + bne PCMC10 + bsr PCMBCL +PCMC10: swap d2 + movem.l d2/d6/d7/a6,-(sp) + movea.l a3,a6 + bra PCMC12 +PCMC11: movem.l d2/a5,(sp) +PCMC12: move.l a6,d2 + sub.l a0,d2 + bls PCMC13 + moveq #0,d6 + lea PCMC13(pc),a5 + jmp (a4) +PCMC13: tst.w d3 + ble PCMC17 +PCMC14: movem.l (sp),d2/a5 + tst.w d2 + beq PCMC17 + tst.l d2 + bmi PCMC15 + movea.l (a5)+,a0 + movea.l a0,a6 + moveq #0,d6 + move.w (a5)+,d6 + adda.l d6,a6 + dbra d2,PCMC11 + bra PCMC16 +PCMC15: move.l (a5)+,d6 + btst #0,d6 + bne PCMC16 + movea.l d6,a0 + movea.l d6,a6 + moveq #0,d6 + move.w (a5)+,d6 + btst #0,d6 + bne PCMC16 + adda.l d6,a6 + dbra d2,PCMC11 +PCMC16: movem.l d2/a5,(sp) +PCMC17: tst.w d3 + sgt d5 + movea.l a6,a3 + move.b d7,$B(sp) + movem.l (sp)+,d2/d6/d7/a6 + bra PCMC0X + +PCMC2: andi.b #$1F,(a6) * リンクアレイチェーンモード + movem.l 4(a6),d0-d5/a0-a4 + move.b $55(a6),d7 + move.w d6,sr + addi.w #$100,d7 + move.l d3,d6 + moveq #0,d3 + move.w PCMBL1(pc),d3 + btst d2,d7 + bne PCMC20 + adda.w -2(a4),a4 + cmpi.b #$1F,d2 + bne PCMC20 + bsr PCMBCL +PCMC20: swap d2 + movem.l d2/d6/d7/a6,-(sp) + movea.l a3,a6 + bra PCMC22 +PCMC21: movem.l d2/a5,(sp) +PCMC22: move.l a6,d2 + sub.l a0,d2 + bls PCMC23 + moveq #0,d6 + lea PCMC23(pc),a5 + jmp (a4) +PCMC23: tst.w d3 + ble PCMC27 +PCMC24: movem.l (sp),d2/a5 + tst.w d2 + bmi PCMC27 + move.l (a5)+,d6 + beq PCMC26 + btst #0,d6 + bne PCMC26 + movea.l d6,a5 + tst.l d2 + bmi PCMC25 + movea.l (a5)+,a0 + movea.l a0,a6 + moveq #0,d6 + move.w (a5)+,d6 + adda.l d6,a6 + bra PCMC21 +PCMC25: move.l (a5)+,d6 + btst #0,d6 + bne PCMC26 + movea.l d6,a0 + movea.l d6,a6 + moveq #0,d6 + move.w (a5)+,d6 + btst #0,d6 + bne PCMC26 + adda.l d6,a6 + bra PCMC21 +PCMC26: move.w #$FFFF,d2 + movem.l d2/a5,(sp) +PCMC27: tst.w d3 + sgt d5 + movea.l a6,a3 + move.b d7,$B(sp) + movem.l (sp)+,d2/d6/d7/a6 + bra PCMC0X + +PCMC3: andi.b #$1F,(a6) * MPCMモード + movem.l 4(a6),d0-d5/a0-a4 + move.b $55(a6),d7 + move.w d6,sr + addi.w #$100,d7 + move.l d3,d6 + moveq #0,d3 + move.w PCMBL1(pc),d3 + btst d2,d7 + bne PCMC30 + adda.w -2(a4),a4 + cmpi.b #$1F,d2 + bne PCMC30 + bsr PCMBCL +PCMC30: swap d2 + movem.l d2/d6/d7/a6,-(sp) + movea.l a3,a6 + bra PCMC32 +PCMC31: movem.l d2/a5,(sp) +PCMC32: move.l a6,d2 + sub.l a0,d2 + bls PCMC33 + moveq #0,d6 + lea PCMC33(pc),a5 + jmp (a4) +PCMC33: tst.w d3 + ble PCMC39 +PCMC34: movem.l (sp),d2/a5 + tst.w d2 + ble PCMC39 + move.w sr,-(sp) + ori.w #$0700,sr + cmpi.w #2,d2 + bne PCMC35 + move.l 8(a5),d6 * LOOP TOP情報 + bne PCMC38 + move.l d0,8(a5) * ADPCMテーブル情報の保存 + bra PCMC38 +PCMC35: cmpi.w #1,d2 + bne PCMC38 + move.l 8(a5),d6 * LOOP END情報 + bne PCMC36 + move.l d0,8(a5) * ADPCMテーブル情報の保存 +PCMC36: move.l $C(a5),d6 * LOOP回数チェック + beq PCMC37 + move.l $10(a5),d6 * LOOPカウンタチェック + beq PCMC38 + subq.l #1,d6 + move.l d6,$10(a5) +PCMC37: movea.l -8(a5),a0 * 繰り返し + move.l 4(a5),d0 + move.w (sp)+,sr + bra PCMC31 +PCMC38: movea.l a6,a0 * 次のブロック + move.l (a5)+,a6 + move.w (sp)+,sr + dbra d2,PCMC31 + movem.l d2/a5,(sp) +PCMC39: tst.w d3 + sgt d5 + movea.l a6,a3 + move.b d7,$B(sp) + movem.l (sp)+,d2/d6/d7/a6 + bra PCMC0X + +PCMC4: movea.l DPCMBF-WK(a6),a5 * 8/16ビットPCMの合成 + move.w PCMBL1-WK(a6),d6 +PCMC40: moveq #3,d4 + and.w d6,d4 + add.w d4,d4 + lsr.w #2,d6 + btst #14,d7 * DPCMバッファにデータがあるか? + bne PCMC421 + movea.l a5,a1 + movea.l PCMBU1-WK(a6),a0 + move.w OUTOF1-WK(a6),d0 + move.w d6,d5 + move.w PCMC410(pc,d4.w),d1 + jmp PCMC410(pc,d1.w) +PCMC410: + .dc.w PCMC415-PCMC410,PCMC414-PCMC410,PCMC413-PCMC410,PCMC412-PCMC410 +PCMC411: + move.w (a0)+,d1 + sub.w d1,d0 + move.w d0,(a1)+ + move.w (a0)+,d0 + sub.w d0,d1 + move.w d1,(a1)+ +PCMC412: + move.w (a0)+,d1 + sub.w d1,d0 + move.w d0,(a1)+ + move.w (a0)+,d0 + sub.w d0,d1 + move.w d1,(a1)+ +PCMC413: + move.w (a0)+,d1 + sub.w d1,d0 + move.w d0,(a1)+ + move.w (a0)+,d0 + sub.w d0,d1 + move.w d1,(a1)+ +PCMC414: + move.w (a0)+,d1 + sub.w d1,d0 + move.w d0,(a1)+ + move.w (a0)+,d0 + sub.w d0,d1 + move.w d1,(a1)+ +PCMC415: + dbra d5,PCMC411 + bra PCMC441 + +PCMC421: * 前のデータに加算する場合の処理 + movea.l a5,a1 + movea.l PCMBU1-WK(a6),a0 + move.w OUTOF1-WK(a6),d0 + move.w d6,d5 + move.w PCMC430(pc,d4.w),d1 + jmp PCMC430(pc,d1.w) +PCMC430: + .dc.w PCMC435-PCMC430,PCMC434-PCMC430,PCMC433-PCMC430,PCMC432-PCMC430 +PCMC431: + move.w (a0)+,d1 + sub.w d1,d0 + add.w d0,(a1)+ + move.w (a0)+,d0 + sub.w d0,d1 + add.w d1,(a1)+ +PCMC432: + move.w (a0)+,d1 + sub.w d1,d0 + add.w d0,(a1)+ + move.w (a0)+,d0 + sub.w d0,d1 + add.w d1,(a1)+ +PCMC433: + move.w (a0)+,d1 + sub.w d1,d0 + add.w d0,(a1)+ + move.w (a0)+,d0 + sub.w d0,d1 + add.w d1,(a1)+ +PCMC434: + move.w (a0)+,d1 + sub.w d1,d0 + add.w d0,(a1)+ + move.w (a0)+,d0 + sub.w d0,d1 + add.w d1,(a1)+ +PCMC435: + dbra d5,PCMC431 +PCMC441: + move.w d0,OUTOF1-WK(a6) +PCMC4X: swap d7 + move.w d7,-(sp) + moveq #0,d6 + move.b (sp)+,d6 + rts + + .dc.w AD01-AD00 +AD00: add.w d3,d3 * ADPCM 1倍~2倍 + cmp.l d3,d2 + bcs AD02 + lsr.w #2,d3 + tst.b d7 + bmi AD002 + dbra d3,AD0000 + jmp (a5) +AD0000: add.w d5,d4 + bcs AD0011 +AD0001: APA0 + add.w d5,d4 + bcs AD0032 +AD0002: add.w d1,(a1)+ + add.w d5,d4 + bcs AD0013 +AD0003: APA0 + add.w d5,d4 + bcs AD0034 +AD0004: add.w d1,(a1)+ + dbra d3,AD0000 + sf d7 + jmp (a5) +AD0011: AP10 + add.w d5,d4 + bcc AD0022 +AD0012: AP10 + add.w d5,d4 + bcc AD0003 +AD0013: AP10 + add.w d5,d4 + bcc AD0024 +AD0014: AP10 + dbra d3,AD0000 + sf d7 + jmp (a5) +AD002: dbra d3,AD0020 + jmp (a5) +AD0020: add.w d5,d4 + bcs AD0031 +AD0021: add.w d1,(a1)+ + add.w d5,d4 + bcs AD0012 +AD0022: APA0 + add.w d5,d4 + bcs AD0033 +AD0023: add.w d1,(a1)+ + add.w d5,d4 + bcs AD0014 +AD0024: APA0 + dbra d3,AD0020 + st d7 + jmp (a5) +AD0031: AP12 + add.w d5,d4 + bcc AD0002 +AD0032: AP12 + add.w d5,d4 + bcc AD0023 +AD0033: AP12 + add.w d5,d4 + bcc AD0004 +AD0034: AP12 + dbra d3,AD0020 + st d7 + jmp (a5) + + .dc.w AD0X-AD01 +AD01: add.w d3,d3 + cmp.l d3,d2 + bcs AD03 + lsr.w #2,d3 + tst.b d7 + bmi AD012 + dbra d3,AD0100 + jmp (a5) +AD0100: add.w d5,d4 + bcs AD0111 +AD0101: APA1 + add.w d5,d4 + bcs AD0132 +AD0102: move.w d1,(a1)+ + add.w d5,d4 + bcs AD0113 +AD0103: APA1 + add.w d5,d4 + bcs AD0134 +AD0104: move.w d1,(a1)+ + dbra d3,AD0100 + sf d7 + jmp (a5) +AD0111: AP11 + add.w d5,d4 + bcc AD0122 +AD0112: AP11 + add.w d5,d4 + bcc AD0103 +AD0113: AP11 + add.w d5,d4 + bcc AD0124 +AD0114: AP11 + dbra d3,AD0100 + sf d7 + jmp (a5) +AD012: dbra d3,AD0120 + jmp (a5) +AD0120: add.w d5,d4 + bcs AD0131 +AD0121: move.w d1,(a1)+ + add.w d5,d4 + bcs AD0112 +AD0122: APA1 + add.w d5,d4 + bcs AD0133 +AD0123: move.w d1,(a1)+ + add.w d5,d4 + bcs AD0114 +AD0124: APA1 + dbra d3,AD0120 + st d7 + jmp (a5) +AD0131: AP13 + add.w d5,d4 + bcc AD0102 +AD0132: AP13 + add.w d5,d4 + bcc AD0123 +AD0133: AP13 + add.w d5,d4 + bcc AD0104 +AD0134: AP13 + dbra d3,AD0120 + st d7 + jmp (a5) + +AD02: tst.b d7 + bmi AD021 + dbra d3,AD0201 + jmp (a5) +AD0201: subq.l #1,d2 + bcs AD0202 + add.w d5,d4 + bcc AD0208 + AP10 + dbra d3,AD0201 + sf d7 + jmp (a5) +AD0202: movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs AD0206 + lea AD0205(pc),a4 + sf d7 +AD0203: jmp (a5) + .dc.w AD0203-AD0205 +AD0205: subq.l #1,d2 + bcs AD0203 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + add.w d5,d4 + bcc AD0208 + AP10 + dbra d3,AD0201 + sf d7 + jmp (a5) +AD0206: lea AD0207(pc),a4 + addq.l #2,a1 + sf d7 + jmp (a5) + .dc.w AD0203-AD0207 +AD0207: subq.l #1,d2 + bcs AD0203 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + add.w d5,d4 + bcc AD0208 + AP10 + dbra d3,AD0201 + sf d7 + jmp (a5) +AD0208: APA0 + dbra d3,AD0211 + st d7 + jmp (a5) +AD021: dbra d3,AD0211 + jmp (a5) +AD0211: add.w d5,d4 + bcc AD0218 + subq.l #1,d2 + bcs AD0212 + AP12 + dbra d3,AD0211 + st d7 + jmp (a5) +AD0212: movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs AD0216 + lea AD0215(pc),a4 + st d7 +AD0213: jmp (a5) + .dc.w AD0213-AD0215 +AD0215: subq.l #1,d2 + bcs AD0213 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + add.w (a3,a2.l),d1 + add.w d1,(a1)+ + move.w 2(a3,a2.l),d1 + move.l (a3),d0 + dbra d3,AD0211 + st d7 + jmp (a5) +AD0216: lea AD0217(pc),a4 + add.w d1,(a1)+ + sf d7 + jmp (a5) + .dc.w AD0213-AD0217 +AD0217: subq.l #1,d2 + bcs AD0213 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0)+,d0 + add.w d0,d0 + add.w d0,d0 + movea.l d0,a3 + move.w (a3,a2.l),d1 + add.w d1,(a1)+ + move.w 2(a3,a2.l),d1 + move.l (a3),d0 + dbra d3,AD0211 + st d7 + jmp (a5) +AD0218: add.w d1,(a1)+ + dbra d3,AD0201 + sf d7 + jmp (a5) + +AD03: tst.b d7 + bmi AD031 + dbra d3,AD0301 + jmp (a5) +AD0301: subq.l #1,d2 + bcs AD0302 + add.w d5,d4 + bcc AD0308 + AP11 + dbra d3,AD0301 + sf d7 + jmp (a5) +AD0302: movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs AD0306 + lea AD0305(pc),a4 + sf d7 +AD0303: jmp (a5) + .dc.w AD0X-AD0305 +AD0305: subq.l #1,d2 + bcs AD0303 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + add.w d5,d4 + bcc AD0308 + AP11 + dbra d3,AD0301 + sf d7 + jmp (a5) +AD0306: lea AD0307(pc),a4 + move.w d6,(a1)+ + sf d7 + jmp (a5) + .dc.w AD0X-AD0307 +AD0307: subq.l #1,d2 + bcs AD0303 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + add.w d5,d4 + bcc AD0308 + AP11 + dbra d3,AD0301 + sf d7 + jmp (a5) +AD0308: APA1 + dbra d3,AD0311 + st d7 + jmp (a5) +AD031: dbra d3,AD0311 + jmp (a5) +AD0311: add.w d5,d4 + bcc AD0318 + subq.l #1,d2 + bcs AD0312 + AP13 + dbra d3,AD0311 + st d7 + jmp (a5) +AD0312: movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs AD0316 + lea AD0315(pc),a4 + st d7 +AD0313: jmp (a5) + .dc.w AD0X-AD0315 +AD0315: subq.l #1,d2 + bcs AD0313 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + AP13 + dbra d3,AD0311 + st d7 + jmp (a5) +AD0316: lea AD0317(pc),a4 + move.w d1,(a1)+ + sf d7 + jmp (a5) + .dc.w AD0X-AD0317 +AD0317: subq.l #1,d2 + bcs AD0313 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + AP13 + dbra d3,AD0311 + st d7 + jmp (a5) +AD0318: move.w d1,(a1)+ + dbra d3,AD0301 + sf d7 + jmp (a5) + +AD0X1: move.l d6,(a1)+ +AD0X: dbra d3,AD0X1 + jmp (a5) + + .dc.w AD11-AD10 +AD10: sf d7 * ADPCM 2倍~4倍 + lsl.w #2,d3 + lsr.l #1,d5 + cmp.l d3,d2 + bcs AD12 + moveq #$4,d2 + and.w d3,d2 + lsr.w #3,d3 + move.w AD1000+2(pc,d2.w),d2 + jmp AD1000(pc,d2.w) +AD1000: .dc.l AD1008-AD1000,AD1004-AD1000 +AD1001: add.w d5,d4 + bcs AD1011 + AP10 +AD1002: add.w d5,d4 + bcs AD1012 +AD1003: AP10 +AD1004: add.w d5,d4 + bcs AD1013 +AD1005: AP10 +AD1006: add.w d5,d4 + bcs AD1014 +AD1007: AP10 +AD1008: dbra d3,AD1001 + jmp (a5) +AD1011: AP20 + AP22 + add.w d5,d4 + bcc AD1003 +AD1012: AP20 + AP22 + add.w d5,d4 + bcc AD1005 +AD1013: AP20 + AP22 + add.w d5,d4 + bcc AD1007 +AD1014: AP20 + AP22 + dbra d3,AD1001 + jmp (a5) + + .dc.w AD0X-AD11 +AD11: sf d7 + lsl.w #2,d3 + lsr.l #1,d5 + cmp.l d3,d2 + bcs AD13 + moveq #$4,d2 + and.w d3,d2 + lsr.w #3,d3 + move.w AD1100+2(pc,d2.w),d2 + jmp AD1100(pc,d2.w) +AD1100: .dc.l AD1108-AD1100,AD1104-AD1100 +AD1101: add.w d5,d4 + bcs AD1111 + AP11 +AD1102: add.w d5,d4 + bcs AD1112 +AD1103: AP11 +AD1104: add.w d5,d4 + bcs AD1113 +AD1105: AP11 +AD1106: add.w d5,d4 + bcs AD1114 +AD1107: AP11 +AD1108: dbra d3,AD1101 + jmp (a5) +AD1111: AP20 + AP23 + add.w d5,d4 + bcc AD1103 +AD1112: AP20 + AP23 + add.w d5,d4 + bcc AD1105 +AD1113: AP20 + AP23 + add.w d5,d4 + bcc AD1107 +AD1114: AP20 + AP23 + dbra d3,AD1101 + jmp (a5) + +AD12: lsr.w #1,d3 + dbra d3,AD1201 + jmp (a5) +AD1201: subq.l #1,d2 + bcs AD1202 + add.w d5,d4 + bcs AD1211 + AP10 + dbra d3,AD1201 + jmp (a5) +AD1202: movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs AD1206 + lea AD1205(pc),a4 +AD1203: jmp (a5) + .dc.w AD1203-AD1205 +AD1205: subq.l #1,d2 + bcs AD1203 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + add.w d5,d4 + bcs AD1211 + AP10 + dbra d3,AD1201 + jmp (a5) +AD1206: lea AD1207(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w AD1203-AD1207 +AD1207: subq.l #1,d2 + bcs AD1203 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + add.w d5,d4 + bcs AD1211 + AP10 + dbra d3,AD1201 + jmp (a5) +AD1211: AP20 + subq.l #1,d2 + bcs AD1212 + AP22 + dbra d3,AD1201 + jmp (a5) +AD1212: movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs AD1216 + lea AD1215(pc),a4 +AD1213: jmp (a5) + .dc.w AD1213-AD1215 +AD1215: subq.l #1,d2 + bcs AD1213 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + AP22 + dbra d3,AD1201 + jmp (a5) +AD1216: lea AD1217(pc),a4 + add.w d1,(a1)+ + jmp (a5) + .dc.w AD1213-AD1217 +AD1217: subq.l #1,d2 + bcs AD1213 + movea.l a3,a4 + add.w d3,d3 + AP20 + add.w d1,-2(a1) + dbra d3,AD1201 + jmp (a5) + +AD13: lsr.w #1,d3 + dbra d3,AD1301 + jmp (a5) +AD1301: subq.l #1,d2 + bcs AD1302 + add.w d5,d4 + bcs AD1311 + AP11 + dbra d3,AD1301 + jmp (a5) +AD1302: movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs AD1306 + lea AD1305(pc),a4 +AD1303: jmp (a5) + .dc.w AD1X-AD1305 +AD1305: subq.l #1,d2 + bcs AD1303 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + add.w d5,d4 + bcs AD1311 + AP11 + dbra d3,AD1301 + jmp (a5) +AD1306: lea AD1307(pc),a4 + move.w d6,(a1)+ + jmp (a5) + .dc.w AD1X-AD1307 +AD1307: subq.l #1,d2 + bcs AD1303 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + add.w d5,d4 + bcs AD1311 + AP11 + dbra d3,AD1301 + jmp (a5) +AD1311: AP20 + subq.l #1,d2 + bcs AD1312 + AP23 + dbra d3,AD1301 + jmp (a5) +AD1312: movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs AD1316 + lea AD1315(pc),a4 +AD1313: jmp (a5) + .dc.w AD1X-AD1315 +AD1315: subq.l #1,d2 + bcs AD1313 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + AP23 + dbra d3,AD1301 + jmp (a5) +AD1316: lea AD1317(pc),a4 + move.w d1,(a1)+ + jmp (a5) + .dc.w AD1X-AD1317 +AD1317: subq.l #1,d2 + bcs AD1313 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + AP23 + dbra d3,AD1301 + jmp (a5) + +AD1X1: move.l d6,(a1)+ +AD1X: dbra d3,AD1X1 + jmp (a5) + + .dc.w AD21-AD20 +AD20: sf d7 * ADPCM 4倍以上 + add.w d3,d3 + swap d4 + clr.w d4 + lsr.l #1,d5 + swap d5 + dbra d3,AD2001 + swap d4 + jmp (a5) +AD2001: add.l d5,d4 + addx.w d6,d4 + sub.w d4,d2 + bcs AD2005 +AD2002: subq.w #2,d4 + AP20 +AD2003: AP21 + dbra d4,AD2003 + add.w d1,(a1)+ + clr.w d4 + dbra d3,AD2001 + swap d4 + jmp (a5) +AD2005: subi.l #$10000,d2 + bcc AD2002 + addi.l #$10000,d2 + add.w d4,d2 + subq.w #1,d4 + moveq #0,d1 +AD2006: subq.l #1,d2 + bcs AD2010 + AP21 + dbra d4,AD2006 + add.w d1,(a1)+ + clr.w d4 + dbra d3,AD2001 + swap d4 + jmp (a5) +AD2010: movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs AD2013 + lea AD2012(pc),a4 + swap d4 +AD2011: jmp (a5) + .dc.w AD2011-AD2012 +AD2012: subq.l #1,d2 + bcs AD2011 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + swap d4 + AP21 + dbra d4,AD2006 + add.w d1,(a1)+ + clr.w d4 + dbra d3,AD2001 + swap d4 + jmp (a5) +AD2013: lea AD2014(pc),a4 + addq.l #2,a1 + swap d4 + jmp (a5) + .dc.w AD2011-AD2014 +AD2014: subq.l #1,d2 + bcs AD2011 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + swap d4 + AP21 + dbra d4,AD2006 + add.w d1,(a1)+ + clr.w d4 + dbra d3,AD2001 + swap d4 + jmp (a5) + + .dc.w AD2X-AD21 +AD21: sf d7 + add.w d3,d3 + swap d4 + clr.w d4 + lsr.l #1,d5 + swap d5 + dbra d3,AD2101 + swap d4 + jmp (a5) +AD2101: add.l d5,d4 + addx.w d6,d4 + sub.w d4,d2 + bcs AD2105 +AD2102: subq.w #2,d4 + AP20 +AD2103: AP21 + dbra d4,AD2103 + move.w d1,(a1)+ + clr.w d4 + dbra d3,AD2101 + swap d4 + jmp (a5) +AD2105: subi.l #$10000,d2 + bcc AD2102 + addi.l #$10000,d2 + add.w d4,d2 + subq.w #1,d4 + moveq #0,d1 +AD2106: subq.l #1,d2 + bcs AD2110 + AP21 + dbra d4,AD2106 + move.w d1,(a1)+ + clr.w d4 + dbra d3,AD2101 + swap d4 + jmp (a5) +AD2110: movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs AD2113 + lea AD2112(pc),a4 + swap d4 +AD2111: jmp (a5) + .dc.w AD2X-AD2112 +AD2112: subq.l #1,d2 + bcs AD2111 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + swap d4 + AP21 + dbra d4,AD2106 + move.w d1,(a1)+ + clr.w d4 + dbra d3,AD2101 + swap d4 + jmp (a5) +AD2113: lea AD2114(pc),a4 + move.w d1,(a1)+ + swap d4 + jmp (a5) + .dc.w AD2X-AD2114 +AD2114: subq.l #1,d2 + bcs AD2111 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + swap d4 + AP21 + dbra d4,AD2106 + move.w d1,(a1)+ + clr.w d4 + dbra d3,AD2101 + swap d4 + jmp (a5) + +AD2X1: move.l d6,(a1)+ +AD2X: dbra d3,AD2X1 + jmp (a5) + + .dc.w ADA1-ADA0 +ADA0: cmp.l d3,d2 * ADPCM 1/2倍~1倍 + bcs ADA2 + lsr.w #1,d3 + tst.b d7 + bmi ADA02 + dbra d3,ADA000 + jmp (a5) +ADA000: add.w d5,d4 + bcc ADA011 +ADA001: APA0 + add.w d5,d4 + bcc ADA032 +ADA002: add.w d1,(a1)+ + add.w d5,d4 + bcc ADA013 +ADA003: APA0 + add.w d5,d4 + bcc ADA034 +ADA004: add.w d1,(a1)+ + dbra d3,ADA000 + sf d7 + jmp (a5) +ADA011: addq.l #2,a1 + add.w d5,d4 + bcs ADA022 +ADA012: addq.l #2,a1 + add.w d5,d4 + bcs ADA003 +ADA013: addq.l #2,a1 + add.w d5,d4 + bcs ADA024 +ADA014: addq.l #2,a1 + dbra d3,ADA000 + sf d7 + jmp (a5) + +ADA02: dbra d3,ADA020 + jmp (a5) +ADA020: add.w d5,d4 + bcc ADA031 +ADA021: add.w d1,(a1)+ +ADA02A: add.w d5,d4 + bcc ADA012 +ADA022: APA0 +ADA02B: add.w d5,d4 + bcc ADA033 +ADA023: add.w d1,(a1)+ +ADA02C: add.w d5,d4 + bcc ADA014 +ADA024: APA0 +ADA02D: dbra d3,ADA020 + st d7 + jmp (a5) +ADA031: addq.l #2,a1 + add.w d5,d4 + bcs ADA002 +ADA032: addq.l #2,a1 + add.w d5,d4 + bcs ADA023 +ADA033: addq.l #2,a1 + add.w d5,d4 + bcs ADA004 +ADA034: addq.l #2,a1 + dbra d3,ADA020 + st d7 + jmp (a5) + + .dc.w ADAX-ADA1 +ADA1: cmp.l d3,d2 + bcs ADA3 + lsr.w #1,d3 + tst.b d7 + bmi ADA12 + dbra d3,ADA100 +ADA100: add.w d5,d4 + bcc ADA111 +ADA101: APA1 + add.w d5,d4 + bcc ADA132 +ADA102: move.w d1,(a1)+ + add.w d5,d4 + bcc ADA113 +ADA103: APA1 + add.w d5,d4 + bcc ADA134 +ADA104: move.w d1,(a1)+ + dbra d3,ADA100 + sf d7 + jmp (a5) +ADA111: move.w d6,(a1)+ + add.w d5,d4 + bcs ADA122 +ADA112: move.w d6,(a1)+ + add.w d5,d4 + bcs ADA103 +ADA113: move.w d6,(a1)+ + add.w d5,d4 + bcs ADA124 +ADA114: move.w d6,(a1)+ + dbra d3,ADA100 + sf d7 + jmp (a5) + +ADA12: dbra d3,ADA120 + jmp (a5) +ADA120: add.w d5,d4 + bcc ADA131 +ADA121: move.w d1,(a1)+ +ADA12A: add.w d5,d4 + bcc ADA112 +ADA122: APA1 +ADA12B: add.w d5,d4 + bcc ADA133 +ADA123: move.w d1,(a1)+ +ADA12C: add.w d5,d4 + bcc ADA114 +ADA124: APA1 +ADA12D: dbra d3,ADA120 + st d7 + jmp (a5) +ADA131: move.w d6,(a1)+ + add.w d5,d4 + bcs ADA102 +ADA132: move.w d6,(a1)+ + add.w d5,d4 + bcs ADA123 +ADA133: move.w d6,(a1)+ + add.w d5,d4 + bcs ADA104 +ADA134: move.w d6,(a1)+ + dbra d3,ADA120 + st d7 + jmp (a5) + +ADA2: add.w d3,d3 + tst.b d7 + bmi ADA210 + dbra d3,ADA201 + jmp (a5) +ADA201: add.w d5,d4 + bcc ADA202 + subq.l #1,d2 + bcs ADA205 + APA0 + dbra d3,ADA211 + st d7 + jmp (a5) +ADA202: addq.l #2,a1 + dbra d3,ADA201 + sf d7 + jmp (a5) +ADA205: movea.l a4,a3 + subq.w #1,d3 + lsr.w #1,d3 + bcs ADA208 + lea ADA207(pc),a4 +ADA206: jmp (a5) + .dc.w ADA206-ADA207 +ADA207: subq.l #1,d2 + bcs ADA206 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + APA0 + dbra d3,ADA211 + st d7 + jmp (a5) +ADA208: lea ADA209(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w ADA206-ADA209 +ADA209: subq.l #1,d2 + bcs ADA206 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + APA0 + dbra d3,ADA211 + st d7 + jmp (a5) +ADA210: dbra d3,ADA211 + jmp (a5) +ADA211: add.w d5,d4 + bcc ADA212 + add.w d1,(a1)+ + dbra d3,ADA201 + sf d7 + jmp (a5) +ADA212: addq.l #2,a1 + dbra d3,ADA211 + st d7 + jmp (a5) + +ADA3: add.w d3,d3 + tst.b d7 + bmi ADA310 + dbra d3,ADA301 + jmp (a5) +ADA301: add.w d5,d4 + bcc ADA302 + subq.l #1,d2 + bcs ADA305 + APA1 + dbra d3,ADA311 + st d7 + jmp (a5) +ADA302: move.w d6,(a1)+ + dbra d3,ADA301 + sf d7 + jmp (a5) +ADA305: movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs ADA308 + lea ADA307(pc),a4 +ADA306: jmp (a5) + .dc.w ADAX-ADA307 +ADA307: subq.l #1,d2 + bcs ADA306 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + APA1 + dbra d3,ADA311 + st d7 + jmp (a5) +ADA308: lea ADA309(pc),a4 + move.w d6,(a1)+ + jmp (a5) + .dc.w ADAX-ADA309 +ADA309: subq.l #1,d2 + bcs ADA306 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + APA1 + dbra d3,ADA311 + st d7 + jmp (a5) +ADA310: dbra d3,ADA311 + jmp (a5) +ADA311: add.w d5,d4 + bcc ADA312 + move.w d1,(a1)+ + dbra d3,ADA301 + sf d7 + jmp (a5) +ADA312: move.w d6,(a1)+ + dbra d3,ADA311 + st d7 + jmp (a5) + +ADAX1: move.l d6,(a1)+ +ADAX: dbra d3,ADAX1 + jmp (a5) + + .dc.w ADB1-ADB0 +ADB0: add.w d3,d3 * ADPCM 1/2倍以下 + dbra d3,ADB000 + jmp (a5) +ADB000: tst.b d7 + bmi ADB004 +ADB001: add.w d5,d4 + bcc ADB002 + subq.l #1,d2 + bcs ADB010 + APA0 + dbra d3,ADB004 + st d7 + jmp (a5) +ADB002: addq.l #2,a1 + dbra d3,ADB001 + sf d7 + jmp (a5) +ADB004: add.w d5,d4 + bcc ADB005 + add.w d1,(a1)+ + dbra d3,ADB001 + sf d7 + jmp (a5) +ADB005: addq.l #2,a1 + dbra d3,ADB004 + st d7 + jmp (a5) +ADB010: sf d7 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs ADB013 + lea ADB012(pc),a4 +ADB011: jmp (a5) + .dc.w ADB011-ADB012 +ADB012: subq.l #1,d2 + bcs ADB011 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + APA0 + dbra d3,ADB004 + st d7 + jmp (a5) +ADB013: lea ADB014(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w ADB011-ADB014 +ADB014: subq.l #1,d2 + bcs ADB011 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + APA0 + dbra d3,ADB004 + st d7 + jmp (a5) + + .dc.w ADBX-ADB1 +ADB1: add.w d3,d3 + dbra d3,ADB100 + jmp (a5) +ADB100: tst.b d7 + bmi ADB104 +ADB101: add.w d5,d4 + bcc ADB102 + subq.l #1,d2 + bcs ADB110 + APA1 + dbra d3,ADB104 + st d7 + jmp (a5) +ADB102: move.w d6,(a1)+ + dbra d3,ADB101 +ADB103: sf d7 + jmp (a5) +ADB104: add.w d5,d4 + bcc ADB105 + move.w d1,(a1)+ + dbra d3,ADB101 + sf d7 + jmp (a5) +ADB105: move.w d6,(a1)+ + dbra d3,ADB104 + st d7 + jmp (a5) +ADB110: sf d7 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs ADB113 + lea ADB112(pc),a4 +ADB111: jmp (a5) + .dc.w ADBX-ADB112 +ADB112: subq.l #1,d2 + bcs ADB111 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + APA1 + dbra d3,ADB104 + st d7 + jmp (a5) +ADB113: lea ADB114(pc),a4 + move.w d6,(a1)+ + jmp (a5) + .dc.w ADBX-ADB114 +ADB114: subq.l #1,d2 + bcs ADB111 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + APA1 + dbra d3,ADB104 + st d7 + jmp (a5) + +ADBX1: move.l d6,(a1)+ +ADBX: dbra d3,ADBX1 + jmp (a5) + + .dc.w ADM01-ADM0 +ADM0: sf d7 * ADPCM 1倍のみ + cmp.l d3,d2 + bcs ADM02 + moveq #7,d2 + and.w d3,d2 + lsr.w #3,d3 + move.b ADM001(pc,d2.w),d2 + jmp ADM002(pc,d2.w) +ADM001: .dc.b ADM00A-ADM002,ADM009-ADM002,ADM008-ADM002,ADM007-ADM002 + .dc.b ADM006-ADM002,ADM005-ADM002,ADM004-ADM002,ADM003-ADM002 +ADM002: AP00 +ADM003: AP00 +ADM004: AP00 +ADM005: AP00 +ADM006: AP00 +ADM007: AP00 +ADM008: AP00 +ADM009: AP00 +ADM00A: dbra d3,ADM002 + jmp (a5) + + .dc.w ADM0X-ADM01 +ADM01: sf d7 + cmp.l d3,d2 + bcs ADM03 + moveq #7,d2 + and.w d3,d2 + lsr.w #3,d3 + move.b ADM011(pc,d2.w),d2 + jmp ADM012(pc,d2.w) +ADM011: .dc.b ADM01A-ADM012,ADM019-ADM012,ADM018-ADM012,ADM017-ADM012 + .dc.b ADM016-ADM012,ADM015-ADM012,ADM014-ADM012,ADM013-ADM012 +ADM012: AP01 +ADM013: AP01 +ADM014: AP01 +ADM015: AP01 +ADM016: AP01 +ADM017: AP01 +ADM018: AP01 +ADM019: AP01 +ADM01A: dbra d3,ADM012 + jmp (a5) + +ADM021: subq.l #1,d2 + bcs ADM022 + AP00 +ADM02: dbra d3,ADM021 + jmp (a5) +ADM022: movea.l a4,a3 + addq.w #1,d3 + lea ADM024(pc),a4 +ADM023: jmp (a5) + .dc.w ADM023-ADM024 +ADM024: subq.l #1,d2 + bcs ADM023 + movea.l a3,a4 + subq.w #1,d3 + AP00 + dbra d3,ADM021 + jmp (a5) + +ADM031: subq.l #1,d2 + bcs ADM032 + AP01 +ADM03: dbra d3,ADM031 + jmp (a5) +ADM032: movea.l a4,a3 + addq.w #1,d3 + lea ADM034(pc),a4 +ADM033: jmp (a5) + .dc.w ADM0X-ADM034 +ADM034: subq.l #1,d2 + bcs ADM033 + movea.l a3,a4 + subq.w #1,d3 + AP01 + dbra d3,ADM031 + jmp (a5) + +ADM0X1: move.l d6,(a1)+ +ADM0X: dbra d3,ADM0X1 + jmp (a5) + + .dc.w ADM11-ADM1 +ADM1: sf d7 * ADPCM 2倍のみ + add.w d3,d3 + cmp.l d3,d2 + bcs ADM12 + moveq #6,d2 + and.w d3,d2 + lsr.w #3,d3 + move.w ADM101(pc,d2.w),d2 + jmp ADM102(pc,d2.w) +ADM101: .dc.w ADM106-ADM102,ADM105-ADM102,ADM104-ADM102,ADM103-ADM102 +ADM102: AP10 + AP10 +ADM103: AP10 + AP10 +ADM104: AP10 + AP10 +ADM105: AP10 + AP10 +ADM106: dbra d3,ADM102 + jmp (a5) + + .dc.w ADM1X-ADM11 +ADM11: sf d7 + add.w d3,d3 + cmp.l d3,d2 + bcs ADM13 + moveq #6,d2 + and.w d3,d2 + lsr.w #3,d3 + move.w ADM111(pc,d2.w),d2 + jmp ADM112(pc,d2.w) +ADM111: .dc.w ADM116-ADM112,ADM115-ADM112,ADM114-ADM112,ADM113-ADM112 +ADM112: AP11 + AP11 +ADM113: AP11 + AP11 +ADM114: AP11 + AP11 +ADM115: AP11 + AP11 +ADM116: dbra d3,ADM112 + jmp (a5) + +ADM121: subq.l #1,d2 + bcs ADM122 + AP10 +ADM12: dbra d3,ADM121 + jmp (a5) +ADM122: movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs ADM125 + lea ADM124(pc),a4 +ADM123: jmp (a5) + .dc.w ADM123-ADM124 +ADM124: subq.l #1,d2 + bcs ADM123 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + AP10 + dbra d3,ADM121 + jmp (a5) +ADM125: lea ADM126(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w ADM123-ADM126 +ADM126: subq.l #1,d2 + bcs ADM123 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + AP10 + dbra d3,ADM121 + jmp (a5) + +ADM131: subq.l #1,d2 + bcs ADM132 + AP11 +ADM13: dbra d3,ADM131 + jmp (a5) +ADM132: movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs ADM135 + lea ADM134(pc),a4 +ADM133: jmp (a5) + .dc.w ADM1X-ADM134 +ADM134: subq.l #1,d2 + bcs ADM133 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + AP11 + dbra d3,ADM131 + jmp (a5) +ADM135: lea ADM136(pc),a4 + move.w d6,(a1)+ + jmp (a5) + .dc.w ADM1X-ADM136 +ADM136: subq.l #1,d2 + bcs ADM133 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + AP11 + dbra d3,ADM131 + jmp (a5) + +ADM1X1: move.l d6,(a1)+ +ADM1X: dbra d3,ADM1X1 + jmp (a5) + + .dc.w ADMA1-ADMA +ADMA: sf d7 * ADPCM 1/2倍のみ + lsr.w #1,d3 + cmp.l d3,d2 + bcs ADMA2 + moveq #3,d2 + and.w d3,d2 + lsr.w #2,d3 + move.b ADMA01(pc,d2.w),d2 + jmp ADMA02(pc,d2.w) +ADMA01: .dc.b ADMA06-ADMA02,ADMA05-ADMA02,ADMA04-ADMA02,ADMA03-ADMA02 +ADMA02: APA2 +ADMA03: APA2 +ADMA04: APA2 +ADMA05: APA2 +ADMA06: dbra d3,ADMA02 + jmp (a5) + + .dc.w ADMAX-ADMA1 +ADMA1: sf d7 + lsr.w #1,d3 + cmp.l d3,d2 + bcs ADMA3 + moveq #3,d2 + and.w d3,d2 + lsr.w #2,d3 + move.b ADMA11(pc,d2.w),d2 + jmp ADMA12(pc,d2.w) +ADMA11: .dc.b ADMA16-ADMA12,ADMA15-ADMA12,ADMA14-ADMA12,ADMA13-ADMA12 +ADMA12: APA3 +ADMA13: APA3 +ADMA14: APA3 +ADMA15: APA3 +ADMA16: dbra d3,ADMA12 + jmp (a5) + +ADMA21: subq.l #1,d2 + bcs ADMA22 + APA2 +ADMA2: dbra d3,ADMA21 + jmp (a5) +ADMA22: movea.l a4,a3 + addq.w #1,d3 + add.w d3,d3 + lea ADMA24(pc),a4 +ADMA23: jmp (a5) + .dc.w ADMA23-ADMA24 +ADMA24: subq.l #1,d2 + bcs ADMA23 + movea.l a3,a4 + lsr.w #1,d3 + subq.w #1,d3 + APA2 + dbra d3,ADMA21 + jmp (a5) + +ADMA31: subq.l #1,d2 + bcs ADMA32 + APA3 +ADMA3: dbra d3,ADMA31 + jmp (a5) +ADMA32: movea.l a4,a3 + addq.w #1,d3 + add.w d3,d3 + lea ADMA34(pc),a4 +ADMA33: jmp (a5) + .dc.w ADMAX-ADMA34 +ADMA34: subq.l #1,d2 + bcs ADMA33 + movea.l a3,a4 + lsr.w #1,d3 + subq.w #1,d3 + APA3 + dbra d3,ADMA31 + jmp (a5) + +ADMAX1: move.l d6,(a1)+ +ADMAX: dbra d3,ADMAX1 + jmp (a5) + + .dc.w P16X00-P16X0 +P16X0: add.w d3,d3 + cmpi.l #$10000,d5 + bhi P16X1 + dbra d3,P16X01 + jmp (a5) + .dc.w P16X0X-P16X00 +P16X00: add.w d3,d3 + cmpi.l #$10000,d5 + bhi P16X1 + dbra d3,P16X01 + jmp (a5) +P16X01: add.w d5,d4 + bcc P16X03 + subq.w #2,d2 + bcs P16X04 +P16X02: addq.l #2,a0 +P16X03: addq.l #2,a1 + dbra d3,P16X01 + jmp (a5) +P16X04: subi.l #$10000,d2 + bcc P16X02 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16X07 + lea P16X06(pc),a4 +P16X05: jmp (a5) + .dc.w P16X0X-P16X06 +P16X06: subq.l #2,d2 + bcs P16X05 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + addq.l #2,a0 + addq.l #2,a1 + dbra d3,P16X01 + jmp (a5) +P16X07: lea P16X08(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w P16X0X-P16X08 +P16X08: subq.l #2,d2 + bcs P16X05 + movea.l a3,a4 + add.w d3,d3 + addq.l #2,a0 + dbra d3,P16X01 +P16X0X: jmp (a5) + +P16X1: swap d5 + add.w d5,d5 + movea.w d5,a3 + swap d5 + addq.l #2,a3 + dbra d3,P16X11 + jmp (a5) +P16X11: add.w d5,d4 + bcc P16X21 + sub.w a3,d2 + bcs P16X13 +P16X12: adda.w a3,a0 + addq.l #2,a1 + dbra d3,P16X11 + jmp (a5) +P16X13: subi.l #$10000,d2 + bcc P16X12 + move.l a4,d7 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16X17 + lea P16X15(pc),a4 +P16X14: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16X0X-P16X15 +P16X15: sub.w d1,d2 + bcs P16X16 + movea.l d7,a4 + add.w d3,d3 + subq.w #1,d3 + adda.w d1,a0 + addq.l #2,a1 + dbra d3,P16X11 + jmp (a5) +P16X16: subi.l #$10000,d2 + bcs P16X14 + movea.l d7,a4 + add.w d3,d3 + subq.w #1,d3 + adda.w d1,a0 + addq.l #2,a1 + dbra d3,P16X11 + jmp (a5) +P16X17: lea P16X19(pc),a4 + addq.l #2,a1 +P16X18: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16X0X-P16X19 +P16X19: sub.w d1,d2 + bcs P16X1A + movea.l d7,a4 + add.w d3,d3 + adda.w d1,a0 + dbra d3,P16X11 + jmp (a5) +P16X1A: subi.l #$10000,d2 + bcs P16X18 + movea.l d7,a4 + add.w d3,d3 + adda.w d1,a0 + dbra d3,P16X11 + jmp (a5) +P16X21: swap d5 + sub.w d5,d2 + bcs P16X23 +P16X22: adda.w d5,a0 + swap d5 + addq.l #2,a1 + dbra d3,P16X11 + jmp (a5) +P16X23: subi.l #$10000,d2 + bcc P16X22 + swap d5 + move.l a4,d7 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16X27 + lea P16X25(pc),a4 +P16X24: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16X0X-P16X25 +P16X25: sub.w d1,d2 + bcs P16X26 + movea.l d7,a4 + add.w d3,d3 + subq.w #1,d3 + adda.w d1,a0 + addq.l #2,a1 + dbra d3,P16X11 + jmp (a5) +P16X26: subi.l #$10000,d2 + bcs P16X24 + movea.l d7,a4 + add.w d3,d3 + subq.w #1,d3 + adda.w d1,a0 + addq.l #2,a1 + dbra d3,P16X11 + jmp (a5) +P16X27: lea P16X29(pc),a4 + addq.l #2,a1 +P16X28: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P16X0X-P16X29 +P16X29: sub.w d1,d2 + bcs P16X2A + movea.l d7,a4 + add.w d3,d3 + adda.w d1,a0 + dbra d3,P16X11 + jmp (a5) +P16X2A: subi.l #$10000,d2 + bcs P16X28 + movea.l d7,a4 + add.w d3,d3 + adda.w d1,a0 + dbra d3,P16X11 + jmp (a5) + + .dc.w P08X00-P08X0 +P08X0: add.w d3,d3 + cmpi.l #$10000,d5 + bhi P08X1 + dbra d3,P08X01 + jmp (a5) + .dc.w P08X0X-P08X00 +P08X00: add.w d3,d3 + cmpi.l #$10000,d5 + bhi P08X1 + dbra d3,P08X01 + jmp (a5) +P08X01: add.w d5,d4 + bcc P08X03 + subq.w #1,d2 + bcs P08404 +P08X02: addq.l #1,a0 +P08X03: addq.l #2,a1 + dbra d3,P08X01 + jmp (a5) +P08X04: subi.l #$10000,d2 + bcc P08X03 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P08X07 + lea P08X06(pc),a4 +P08X05: jmp (a5) + .dc.w P08X0X-P08X06 +P08X06: subq.l #1,d2 + bcs P08X05 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + addq.l #1,a0 + addq.l #2,a1 + dbra d3,P08X01 + jmp (a5) +P08X07: lea P08X06(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w P08X0X-P08X08 +P08X08: subq.l #1,d2 + bcs P08X05 + movea.l a3,a4 + add.w d3,d3 + addq.l #1,a0 + dbra d3,P08X01 +P08X0X: jmp (a5) + +P08X1: swap d5 + movea.w d5,a3 + swap d5 + addq.l #1,a3 + dbra d3,P08X11 + jmp (a5) +P08X11: add.w d5,d4 + bcc P08X21 + sub.w a3,d2 + bcs P08X13 +P08X12: adda.w a3,a0 + addq.l #2,a1 + dbra d3,P08X11 + jmp (a5) +P08X13: subi.l #$10000,d2 + bcc P08X12 + move.l a4,d7 + addq.w #1,d3 + lsr.w #1,d3 + bcs P08X17 + lea P08X15(pc),a4 +P08X14: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P08X0X-P08X15 +P08X15: sub.w d1,d2 + bcs P08X16 + movea.l d7,a4 + add.w d3,d3 + subq.w #1,d3 + adda.w d1,a0 + addq.l #2,a1 + dbra d3,P08X11 + jmp (a5) +P08X16: subi.l #$10000,d2 + bcs P08X14 + movea.l d7,a4 + add.w d3,d3 + subq.w #1,d3 + adda.w d1,a0 + addq.l #2,a1 + dbra d3,P08X11 + jmp (a5) +P08X17: lea P08X19(pc),a4 + addq.l #2,a1 +P08X18: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P08X0X-P08X19 +P08X19: sub.w d1,d2 + bcs P08X1A + movea.l d7,a4 + add.w d3,d3 + adda.w d1,a0 + dbra d3,P08X11 + jmp (a5) +P08X1A: subi.l #$10000,d2 + bcs P08X18 + movea.l d7,a4 + add.w d3,d3 + adda.w d1,a0 + dbra d3,P08X11 + jmp (a5) +P08X21: swap d5 + sub.w d5,d2 + bcs P08X23 +P08X22: adda.w d5,a0 + swap d5 + addq.l #2,a1 + dbra d3,P08X11 + jmp (a5) +P08X23: subi.l #$10000,d2 + bcc P08X22 + swap d5 + move.l a4,d7 + addq.w #1,d3 + lsr.w #1,d3 + bcs P08X27 + lea P08X25(pc),a4 +P08X24: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P08X0X-P08X25 +P08X25: sub.w d1,d2 + bcs P08X26 + movea.l d7,a4 + add.w d3,d3 + subq.w #1,d3 + adda.w d1,a0 + addq.l #2,a1 + dbra d3,P08X11 + jmp (a5) +P08X26: subi.l #$10000,d2 + bcs P08X24 + movea.l d7,a4 + add.w d3,d3 + subq.w #1,d3 + adda.w d1,a0 + addq.l #2,a1 + dbra d3,P08X11 + jmp (a5) +P08X27: lea P08X29(pc),a4 + addq.l #2,a1 +P08X28: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P08X0X-P08X29 +P08X29: sub.w d1,d2 + bcs P08X2A + movea.l d7,a4 + add.w d3,d3 + adda.w d1,a0 + dbra d3,P08X11 + jmp (a5) +P08X2A: subi.l #$10000,d2 + bcs P08X28 + movea.l d7,a4 + add.w d3,d3 + adda.w d1,a0 + dbra d3,P08X11 + jmp (a5) + +*-------------------------------------------------------------------- +* これ以降は常駐時のオプション指定により変化する +TBLTOP: +TBLT16: .dc.b $40,$41 * 対応する音量範囲 + .dc.w 0 * 追加バイト数/256(ビット15-8),フラグ(ビット7-0)←8ビットPCM用 + .dc.w P1641B-P1641A * プログラム長さ +P1641A: P16F 9,2 +P1641B: + + .dc.b $42,$44 + .dc.w 0 + .dc.w P1643B-P1643A +P1643A: P16F 9,1 +P1643B: + + .dc.b $45,$47 + .dc.w 0 + .dc.w P1646B-P1646A +P1646A: P16E 8 +P1646B: + + .dc.b $48,$49 + .dc.w 0 + .dc.w P1648B-P1648A +P1648A: P16F 8,2 +P1648B: + + .dc.b $4A,$4B + .dc.w 0 + .dc.w P164AB-P164AA +P164AA: P16F 8,1 +P164AB: + + .dc.b $4C,$4E + .dc.w 0 + .dc.w P164DB-P164DA +P164DA: P16E 7 +P164DB: + + .dc.b $4F,$50 + .dc.w 0 + .dc.w P1650B-P1650A +P1650A: P16F 7,2 +P1650B: + + .dc.b $51,$53 + .dc.w 0 + .dc.w P1652B-P1652A +P1652A: P16F 7,1 +P1652B: + + .dc.b $54,$56 + .dc.w 0 + .dc.w P1655B-P1655A +P1655A: P16E 6 +P1655B: + + .dc.b $57,$5A + .dc.w 0 + .dc.w P1658B-P1658A +P1658A: P16F 6,1 +P1658B: + + .dc.b $5B,$5C + .dc.w 0 + .dc.w P165CB-P165CA +P165CA: P16E 5 +P165CB: + + .dc.b $5D,$5E + .dc.w 0 + .dc.w P165EB-P165EA +P165EA: P16F 5,2 +P165EB: + + .dc.b $5F,$61 + .dc.w 0 + .dc.w P1660B-P1660A +P1660A: P16F 5,1 +P1660B: + + .dc.b $62,$63 + .dc.w 0 + .dc.w P1663B-P1663A +P1663A: P16E 4 +P1663B: + + .dc.b $64,$65 + .dc.w 0 + .dc.w P1665B-P1665A +P1665A: P16F 4,2 +P1665B: + + .dc.b $66,$68 + .dc.w 0 + .dc.w P1667B-P1667A +P1667A: P16F 4,1 +P1667B: + + .dc.b $69,$6B + .dc.w 0 + .dc.w P166BB-P166BA +P166BA: P16E 3 +P166BB: + + .dc.b $6C,$6D + .dc.w 0 + .dc.w P166DB-P166DA +P166DA: P16F 3,2 +P166DB: + + .dc.b $6E,$6F + .dc.w 0 + .dc.w P166FB-P166FA +P166FA: P16F 3,1 +P166FB: + + .dc.b $70,$72 + .dc.w 0 + .dc.w P1671B-P1671A +P1671A: P16E 2 +P1671B: + + .dc.b $73,$74 + .dc.w 0 + .dc.w P1674B-P1674A +P1674A: P16F 2,2 +P1674B: + + .dc.b $75,$77 + .dc.w 0 + .dc.w P1676B-P1676A +P1676A: P16F 2,1 +P1676B: + + .dc.b $78,$79 + .dc.w 0 + .dc.w P1679B-P1679A +P1679A: P16E 1 +P1679B: + + .dc.b $7A,$7C + .dc.w 0 + .dc.w P167BB-P167BA +P167BA: P16F 1,2 +P167BB: + + .dc.b $7D,$7E + .dc.w 0 + .dc.w P167DB-P167DA +P167DA: P16F 1,1 +P167DB: + + .dc.b $7F,$81 + .dc.w 0 + .dc.w P1680B-P1680A +P1680A: .dc.w P16800-P1680 +P1680: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P1681 + dbra d3,P16801 + jmp (a5) + .dc.w P1680X-P16800 +P16800: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P1681 + dbra d3,P16801 + jmp (a5) +P16801: add.w d5,d4 + bcc P16803 + subq.w #2,d2 + bcs P16804 +P16802: move.w (a0)+,d0 +P16803: add.w d0,(a1)+ + dbra d3,P16801 + jmp (a5) +P16804: subi.l #$10000,d2 + bcc P16802 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16807 + lea P16806(pc),a4 +P16805: jmp (a5) + .dc.w P1680X-P16806 +P16806: subq.l #2,d2 + bcs P16805 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0)+,d0 + add.w d0,(a1)+ + dbra d3,P16801 + jmp (a5) +P16807: lea P16808(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w P1680X-P16808 +P16808: subq.l #2,d2 + bcs P16805 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0)+,d0 + add.w d0,(a1)+ + dbra d3,P16801 +P1680X: jmp (a5) + +P1681: move.l d5,d7 + swap d7 + add.w d7,d7 + movea.w d7,a2 + addq.w #2,d7 + dbra d3,P16811 + jmp (a5) +P16811: add.w d5,d4 + bcc P16821 + sub.w d7,d2 + bcs P16813 +P16812: move.w (a0),d0 + adda.w d7,a0 + add.w d0,(a1)+ + dbra d3,P16811 + jmp (a5) +P16813: subi.l #$10000,d2 + bcc P16812 + move.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16817 + lea P16815(pc),a4 +P16814: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P1680X-P16815 +P16815: sub.w d1,d2 + bcs P16816 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + add.w d0,(a1)+ + dbra d3,P16811 + jmp (a5) +P16816: subi.l #$10000,d2 + bcs P16814 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + add.w d0,(a1)+ + dbra d3,P16811 + jmp (a5) +P16817: lea P16819(pc),a4 + addq.l #2,a1 +P16818: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P1680X-P16819 +P16819: sub.w d1,d2 + bcs P1681C + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + add.w d0,(a1)+ + dbra d3,P16811 + jmp (a5) +P1681C: subi.l #$10000,d2 + bcs P16818 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + add.w d0,(a1)+ + dbra d3,P16811 + jmp (a5) +P16821: sub.w a2,d2 + bcs P16823 +P16822: move.w (a0),d0 + adda.w a2,a0 + add.w d0,(a1)+ + dbra d3,P16811 + jmp (a5) +P16823: subi.l #$10000,d2 + bcc P16822 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P16827 + lea P16825(pc),a4 +P16824: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P1680X-P16825 +P16825: sub.w d1,d2 + bcs P16826 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + add.w d0,(a1)+ + dbra d3,P16811 + jmp (a5) +P16826: subi.l #$10000,d2 + bcs P16824 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + add.w d0,(a1)+ + dbra d3,P16811 + jmp (a5) +P16827: lea P16829(pc),a4 + addq.l #2,a1 +P16828: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P1680X-P16829 +P16829: sub.w d1,d2 + bcs P1682C + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + add.w d0,(a1)+ + dbra d3,P16811 + jmp (a5) +P1682C: subi.l #$10000,d2 + bcs P16828 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + add.w d0,(a1)+ + dbra d3,P16811 + jmp (a5) +P1680B: + + .dc.b $82,$83 + .dc.w 0 + .dc.w P1682B-P1682A +P1682A: P16D 2 +P1682B: + + .dc.b $84,$85 + .dc.w 0 + .dc.w P1684B-P1684A +P1684A: P16D 1 +P1684B: + + .dc.b $86,$88 + .dc.w 0 + .dc.w P1687B-P1687A +P1687A: P16A 1 +P1687B: + + .dc.b $89,$8A + .dc.w 0 + .dc.w P168AB-P168AA +P168AA: .dc.w P168A0-P168A +P168A: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P168B + dbra d3,P168A1 + jmp (a5) + .dc.w P168AX-P168A0 +P168A0: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P168B + dbra d3,P168A1 + jmp (a5) +P168A1: add.w d5,d4 + bcc P168A3 + subq.w #2,d2 + bcs P168A4 +P168A2: move.w (a0)+,d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 +P168A3: add.w d0,(a1)+ + dbra d3,P168A1 + jmp (a5) +P168A4: subi.l #$10000,d2 + bcc P168A2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P168A7 + lea P168A6(pc),a4 +P168A5: jmp (a5) + .dc.w P168AX-P168A6 +P168A6: subq.l #2,d2 + bcs P168A5 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0)+,d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P168A1 + jmp (a5) +P168A7: lea P168A8(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w P168AX-P168A8 +P168A8: subq.l #2,d2 + bcs P168A5 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0)+,d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P168A1 +P168AX: jmp (a5) + +P168B: move.l d5,d7 + swap d7 + add.w d7,d7 + movea.l d7,a2 + addq.w #2,d7 + dbra d3,P168B1 + jmp (a5) +P168B1: add.w d5,d4 + bcc P168C1 + sub.w d7,d2 + bcs P168B3 +P168B2: move.w (a0),d0 + adda.w d7,a0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P168B1 + jmp (a5) +P168B3: subi.l #$10000,d2 + bcc P168B2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P168B7 + lea P168B5(pc),a4 +P168B4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P168AX-P168B5 +P168B5: sub.w d1,d2 + bcs P168B6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P168B1 + jmp (a5) +P168B6: subi.l #$10000,d2 + bcs P168B4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P168B1 + jmp (a5) +P168B7: lea P168B9(pc),a4 + addq.l #2,a1 +P168B8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P168AX-P168B9 +P168B9: sub.w d1,d2 + bcs P168BC + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P168B1 + jmp (a5) +P168BC: subi.l #$10000,d2 + bcs P168B8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P168B1 + jmp (a5) +P168C1: sub.w a2,d2 + bcs P168C3 +P168C2: move.w (a0),d0 + adda.w a2,a0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P168B1 + jmp (a5) +P168C3: subi.l #$10000,d2 + bcc P168C2 + move.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P168C7 + lea P168C5(pc),a4 +P168C4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P168AX-P168C5 +P168C5: sub.w d1,d2 + bcs P168C6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P168B1 + jmp (a5) +P168C6: subi.l #$10000,d2 + bcs P168C4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P168B1 + jmp (a5) +P168C7: lea P168C9(pc),a4 + addq.l #2,a1 +P168C8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P168AX-P168C9 +P168C9: sub.w d1,d2 + bcs P168CC + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P168B1 + jmp (a5) +P168CC: subi.l #$10000,d2 + bcs P168C8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P168B1 + jmp (a5) +P168AB: + + .dc.b $8B,$8D + .dc.w 0 + .dc.w P168CB-P168CA +P168CA: P16B 0 +P168CB: + + .dc.b $8E,$8F + .dc.w 0 + .dc.w P168FB-P168FA +P168FA: P16A 2 +P168FB: + + .dc.b $90,$91 + .dc.w 0 + .dc.w P1691B-P1691A +P1691A: P16C 0 +P1691B: + + .dc.b $92,$94 + .dc.w 0 + .dc.w P1693B-P1693A +P1693A: P16B 1 +P1693B: + + .dc.b $95,$97 + .dc.w 0 + .dc.w P1696B-P1696A +P1696A: P16A 3 +P1696B: + + .dc.b $98,$99 + .dc.w 0 + .dc.w P1698B-P1698A +P1698A: P16C 1 +P1698B: + + .dc.b $9A,$9B + .dc.w 0 + .dc.w P169AB-P169AA +P169AA: P16B 2 +P169AB: + + .dc.b $9C,$9E + .dc.w 0 + .dc.w P169DB-P169DA +P169DA: P16A 4 +P169DB: + + .dc.b $9F,$A0 + .dc.w 0 + .dc.w P169FB-P169FA +P169FA: P16C 2 +P169FB: + .dc.w 0 + +TBLT08: .dc.b $40,$53 + .dc.w 0 + .dc.w P0840B-P0840A +P0840A: .dc.w P08400-P0840 +P0840: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P0841 + dbra d3,P08401 + jmp (a5) + .dc.w P0840X-P08400 +P08400: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P0841 + dbra d3,P08401 + jmp (a5) +P08401: add.w d5,d4 + bcc P08403 + subq.w #1,d2 + bcs P08404 +P08402: addq.l #1,a0 +P08403: dbra d3,P08401 + jmp (a5) +P08404: subi.l #$10000,d2 + bcc P08403 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P08407 + lea P08406(pc),a4 +P08405: jmp (a5) + .dc.w P0840X-P08406 +P08406: subq.l #1,d2 + bcs P08405 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + addq.l #1,a0 + dbra d3,P08401 + jmp (a5) +P08407: lea P08408(pc),a4 + jmp (a5) + .dc.w P0840X-P08408 +P08408: subq.l #1,d2 + bcs P08405 + movea.l a3,a4 + add.w d3,d3 + addq.l #1,a0 + dbra d3,P08401 +P0840X: jmp (a5) + +P0841: move.l d5,d7 + swap d7 + movea.w d7,a2 + addq.w #1,d7 + dbra d3,P08411 + jmp (a5) +P08411: add.w d5,d4 + bcc P08421 + sub.w d7,d2 + bcs P08413 +P08412: adda.w d3,a0 + dbra d3,P08411 + jmp (a5) +P08413: subi.l #$10000,d2 + bcc P08412 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P08417 + lea P08415(pc),a4 +P08414: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P0840X-P08415 +P08415: sub.w d1,d2 + bcs P08416 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + adda.w d1,a0 + dbra d3,P08411 + jmp (a5) +P08416: subi.l #$10000,d2 + bcs P08414 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + adda.w d1,a0 + dbra d3,P08411 + jmp (a5) +P08417: lea P08419(pc),a4 +P08418: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P0840X-P08419 +P08419: sub.w d1,d2 + bcs P0841C + movea.l a3,a4 + add.w d3,d3 + adda.w d1,a0 + dbra d3,P08411 + jmp (a5) +P0841C: subi.l #$10000,d2 + bcs P08418 + movea.l a3,a4 + add.w d3,d3 + adda.w d1,a0 + dbra d3,P08411 + jmp (a5) +P08421: sub.w a2,d2 + bcs P08423 +P08422: adda.w a2,a0 + dbra d3,P08411 + jmp (a5) +P08423: subi.l #$10000,d2 + bcc P08422 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P08427 + lea P08425(pc),a4 +P08424: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P0840X-P08425 +P08425: sub.w d1,d2 + bcs P08426 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + adda.w d1,a0 + dbra d3,P08411 + jmp (a5) +P08426: subi.l #$10000,d2 + bcs P08424 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + adda.w d1,a0 + dbra d3,P08411 + jmp (a5) +P08427: lea P08429(pc),a4 +P08428: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P0840X-P08429 +P08429: sub.w d1,d2 + bcs P0842C + movea.l a3,a4 + add.w d3,d3 + adda.w d1,a0 + dbra d3,P08411 + jmp (a5) +P0842C: subi.l #$10000,d2 + bcs P08428 + movea.l a3,a4 + add.w d3,d3 + adda.w d1,a0 + dbra d3,P08411 + jmp (a5) +P0840B: + + .dc.b $54,$56 + .dc.w 0 + .dc.w P0855B-P0855A +P0855A: PC8E 6 +P0855B: + + .dc.b $57,$5A + .dc.w $161 + .dc.w P0858B-P0858A +P0858A: PC8F +P0858B: + + .dc.b $5B,$5C + .dc.w 0 + .dc.w P085CB-P085CA +P085CA: PC8E 5 +P085CB: + + .dc.b $5D,$5E + .dc.w $152 + .dc.w P085EB-P085EA +P085EA: PC8F +P085EB: + + .dc.b $5F,$61 + .dc.w $151 + .dc.w P0860B-P0860A +P0860A: PC8F +P0860B: + + .dc.b $62,$63 + .dc.w 0 + .dc.w P0863B-P0863A +P0863A: PC8E 4 +P0863B: + + .dc.b $64,$65 + .dc.w $142 + .dc.w P0865B-P0865A +P0865A: PC8F +P0865B: + + .dc.b $66,$68 + .dc.w $141 + .dc.w P0867B-P0867A +P0867A: PC8F +P0867B: + + .dc.b $69,$6B + .dc.w 0 + .dc.w P086BB-P086BA +P086BA: PC8E 3 +P086BB: + + .dc.b $6C,$6D + .dc.w $132 + .dc.w P086DB-P086DA +P086DA: PC8F +P086DB: + + .dc.b $6E,$6F + .dc.w $131 + .dc.w P086FB-P086FA +P086FA: PC8F +P086FB: + + .dc.b $70,$72 + .dc.w 0 + .dc.w P0871B-P0871A +P0871A: PC8E 2 +P0871B: + + .dc.b $73,$74 + .dc.w $122 + .dc.w P0874B-P0874A +P0874A: PC8F +P0874B: + + .dc.b $75,$77 + .dc.w $121 + .dc.w P0876B-P0876A +P0876A: PC8F +P0876B: + + .dc.b $78,$79 + .dc.w 0 + .dc.w P0879B-P0879A +P0879A: PC8E 1 +P0879B: + + .dc.b $7A,$7C + .dc.w $112 + .dc.w P087BB-P087BA +P087BA: PC8F +P087BB: + + .dc.b $7D,$7E + .dc.w $111 + .dc.w P087DB-P087DA +P087DA: PC8F +P087DB: + + .dc.b $7F,$81 + .dc.w 0 + .dc.w P0880B-P0880A +P0880A: .dc.w P08800-P0880 +P0880: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P0881 + dbra d3,P08801 + jmp (a5) + .dc.w P0880X-P08800 +P08800: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P0881 + dbra d3,P08801 + jmp (a5) +P08801: add.w d5,d4 + bcc P08803 + subq.w #1,d2 + bcs P08804 +P08802: move.b (a0)+,d0 + ext.w d0 +P08803: add.w d0,(a1)+ + dbra d3,P08801 + jmp (a5) +P08804: subi.l #$10000,d2 + bcc P08802 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P08807 + lea P08806(pc),a4 +P08805: jmp (a5) + .dc.w P0880X-P08806 +P08806: subq.l #1,d2 + bcs P08805 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0)+,d0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,P08801 + jmp (a5) +P08807: lea P08808(pc),a4 + jmp (a5) + .dc.w P0880X-P08808 +P08808: subq.l #1,d2 + bcs P08805 + movea.l a3,a4 + add.w d3,d3 + move.b (a0)+,d0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,P08801 +P0880X: jmp (a5) + +P0881: move.l d5,d7 + swap d7 + movea.w d7,a2 + addq.w #1,d7 + dbra d3,P08811 + jmp (a5) +P08811: add.w d5,d4 + bcc P08821 + sub.w d7,d2 + bcs P08813 +P08812: move.b (a0),d0 + adda.w d7,a0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,P08811 + jmp (a5) +P08813: subi.l #$10000,d2 + bcc P08812 + move.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P08817 + lea P08815(pc),a4 +P08814: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P0880X-P08815 +P08815: sub.w d1,d2 + bcs P08816 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + adda.w d1,a0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,P08811 + jmp (a5) +P08816: subi.l #$10000,d2 + bcs P08814 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + adda.w d1,a0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,P08811 + jmp (a5) +P08817: lea P08819(pc),a4 + addq.l #2,a1 +P08818: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P0880X-P08819 +P08819: sub.w d1,d2 + bcs P0881C + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + adda.w d1,a0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,P08811 + jmp (a5) +P0881C: subi.l #$10000,d2 + bcs P08818 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + adda.w d1,a0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,P08811 + jmp (a5) +P08821: sub.w a2,d2 + bcs P08823 +P08822: move.w (a0),d0 + adda.w a2,a0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,P08811 + jmp (a5) +P08823: subi.l #$10000,d2 + bcc P08822 + move.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P08827 + lea P08825(pc),a4 +P08824: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P0880X-P08825 +P08825: sub.w d1,d2 + bcs P08826 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,P08811 + jmp (a5) +P08826: subi.l #$10000,d2 + bcs P08824 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,P08811 + jmp (a5) +P08827: lea P08829(pc),a4 + addq.l #2,a1 +P08828: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P0880X-P08829 +P08829: sub.w d1,d2 + bcs P0882C + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,P08811 + jmp (a5) +P0882C: subi.l #$10000,d2 + bcs P08828 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + ext.w d0 + add.w d0,(a1)+ + dbra d3,P08811 + jmp (a5) +P0880B: + + .dc.b $82,$83 + .dc.w 0 + .dc.w P0882B-P0882A +P0882A: PC8D 2 +P0882B: + + .dc.b $84,$85 + .dc.w 0 + .dc.w P0884B-P0884A +P0884A: PC8D 1 +P0884B: + + .dc.b $86,$88 + .dc.w 0 + .dc.w P0887B-P0887A +P0887A: PC8A 1 +P0887B: + + .dc.b $89,$8A + .dc.w 0 + .dc.w P088AB-P088AA +P088AA: .dc.w P088A0-P088A +P088A: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P088B + dbra d3,P088A1 + jmp (a5) + .dc.w P088AX-P088A0 +P088A0: add.w d3,d3 + cmpi.l #$10000,d5 + bcc P088B + dbra d3,P088A1 + jmp (a5) +P088A1: add.w d5,d4 + bcc P088A3 + subq.w #1,d2 + bcs P088A4 +P088A2: move.b (a0)+,d0 + ext.w d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 +P088A3: add.w d0,(a1)+ + dbra d3,P088A1 + jmp (a5) +P088A4: subi.l #$10000,d2 + bcc P088A2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P088A7 + lea P088A6(pc),a4 +P088A5: jmp (a5) + .dc.w P088AX-P088A6 +P088A6: subq.l #1,d2 + bcs P088A5 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0)+,d0 + ext.w d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P088A1 + jmp (a5) +P088A7: lea P088A8(pc),a4 + addq.l #2,a1 + jmp (a5) + .dc.w P088AX-P088A8 +P088A8: subq.l #1,d2 + bcs P088A5 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0)+,d0 + ext.w d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P088A1 +P088AX: jmp (a5) + +P088B: move.l d5,d7 + swap d7 + movea.w d7,a2 + addq.w #1,d7 + dbra d3,P088B1 + jmp (a5) +P088B1: add.w d5,d4 + bcc P088C1 + sub.w d7,d2 + bcs P088B3 +P088B2: move.b (a0),d0 + adda.w d7,a0 + ext.w d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P088B1 + jmp (a5) +P088B3: subi.l #$10000,d2 + bcc P088B2 + move.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P088B7 + lea P088B5(pc),a4 +P088B4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P088AX-P088B5 +P088B5: sub.w d1,d2 + bcs P088B6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + adda.w d1,a0 + ext.w d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P088B1 + jmp (a5) +P088B6: subi.l #$10000,d2 + bcs P088B4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.b (a0),d0 + adda.w d1,a0 + ext.w d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P088B1 + jmp (a5) +P088B7: lea P088B9(pc),a4 + addq.l #2,a1 +P088B8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P088AX-P088B9 +P088B9: sub.w d1,d2 + bcs P088BC + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + adda.w d1,a0 + ext.w d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P088B1 + jmp (a5) +P088BC: subi.l #$10000,d2 + bcs P088B8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.b (a0),d0 + adda.w d1,a0 + ext.w d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P088B1 + jmp (a5) +P088C1: sub.w a2,d2 + bcs P088C3 +P088C2: move.w (a0),d0 + adda.w a2,a0 + ext.w d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P088B1 + jmp (a5) +P088C3: subi.l #$10000,d2 + bcc P088C2 + movea.l a4,a3 + addq.w #1,d3 + lsr.w #1,d3 + bcs P088C7 + lea P088C5(pc),a4 +P088C4: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P088AX-P088C5 +P088C5: sub.w d1,d2 + bcs P088C6 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + ext.w d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P088B1 + jmp (a5) +P088C6: subi.l #$10000,d2 + bcs P088C4 + movea.l a3,a4 + add.w d3,d3 + subq.w #1,d3 + move.w (a0),d0 + adda.w d1,a0 + ext.w d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P088B1 + jmp (a5) +P088C7: lea P088C9(pc),a4 + addq.l #2,a1 +P088C8: neg.w d2 + move.w d2,d1 + jmp (a5) + .dc.w P088AX-P088C9 +P088C9: sub.w d1,d2 + bcs P088CC + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + ext.w d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P088B1 + jmp (a5) +P088CC: subi.l #$10000,d2 + bcs P088C8 + movea.l a3,a4 + subq.l #2,a1 + add.w d3,d3 + move.w (a0),d0 + adda.w d1,a0 + ext.w d0 + move.w d0,d6 + asr.w #1,d6 + add.w d0,d0 + add.w d6,d0 + add.w d0,(a1)+ + dbra d3,P088B1 + jmp (a5) +P088AB: + + .dc.b $8B,$8D + .dc.w 0 + .dc.w P088CB-P088CA +P088CA: PC8B 0 +P088CB: + + .dc.b $8E,$8F + .dc.w 0 + .dc.w P088FB-P088FA +P088FA: PC8A 2 +P088FB: + + .dc.b $90,$91 + .dc.w 0 + .dc.w P0891B-P0891A +P0891A: PC8C 0 +P0891B: + + .dc.b $92,$94 + .dc.w 0 + .dc.w P0893B-P0893A +P0893A: PC8B 1 +P0893B: + + .dc.b $95,$97 + .dc.w 0 + .dc.w P0896B-P0896A +P0896A: PC8A 3 +P0896B: + + .dc.b $98,$99 + .dc.w 0 + .dc.w P0898B-P0898A +P0898A: PC8C 1 +P0898B: + + .dc.b $9A,$9B + .dc.w 0 + .dc.w P089AB-P089AA +P089AA: PC8B 2 +P089AB: + + .dc.b $9C,$9E + .dc.w 0 + .dc.w P089DB-P089DA +P089DA: PC8A 4 +P089DB: + + .dc.b $9F,$A0 + .dc.w 0 + .dc.w P089FB-P089FA +P089FA: PC8C 2 +P089FB: + .dc.w 0 + +*-------------------------------------------------------------------- +* ワークエリア (長さ可変) + +* .align 16 +*DPCMBF .dcb.l PCMBLK,0 * DPCM用バッファ +*PCMBU1 .dcb.l PCMBLK,0 * PCM用バッファ +*ADPBF1 .dcb.b PCMBLK,PCMSP2 * ADPCM出力バッファ1 +*ADPBF2 .dcb.b PCMBLK,PCMSP2 * ADPCM出力バッファ2 +*ADPBFX .dcb.b PCMBLK,PCMSPC * ADPCMダミー出力バッファ +* .align 16 +*CHNWK .dcb.b PCMCHN,0 * チャンネルワーク + * バイト位置 機能 + * 0 動作モード + * ビット7 動作停止 + * 6 初期設定 + * 5 IOCS予約中 + * 4 IOCSモードで使用中 + * 3 IOCS一時停止解除禁止(出力キャンセル) + * 1~0 動作モード(0:通常,1:アレイチェーン,2:リンクアレイチェーン,3:MPCM) + * 1 音量 + * 2 周波数 + * 3 定位 + * 4~7 ADPCM→DPCM変換テーブル情報(ADPCM) + * 8~$B DPCMバッファ + * $C~$D $10のデータポインタ用カウンタ + * $E~$F フラグビット番号($1E:ADPCM,$1F:PCM) + * $10~$13 データポインタ + * $14~$17 音程変換用加算バッファ + * $18~$1B 音程変換用加算値 + * $1C~$1F (AD)PCMデータポインタ + * $20~$23 (D)PCMバッファポインタ + * $24~$27 音量変換オフセット(ADPCM) + * $28~$2B 次のデータポインタ + * $2C~$2F 処理ルーチンアドレス + * $30~$33 データ先頭 + * $34~$37 ループ先頭 + * $38~$3B ループ終了 + * $3C~$3F データ終了 + * $40~$43 ループ先頭のテーブル情報(4~7の内容) + * $44~$47 ループ終了のテーブル情報(4~7の内容) + * $48~$4B ループ回数 + * $4C~$4F ループカウンタ + * $50 PCMの種類($FF:ADPCM,0:無し,1:16bit,2:8bit) + * $51 オリジナルノート番号 + * $52~$53 再生音程 + * $54 音量 + * $55 DPCMバッファ(8~$B)有効フラグ(bit7のみ有効) + * $56~$57 未使用 + * $58 再生周波数(0~6,$F0,$F1) + * $59 KEY OFFモード(0:STOP,1:JUMP) + * $5A~$7F 未使用 + +* これ以降はテーブル領域 + +*-------------------------------------------------------------------- +* コマンドラインからの実行部 + +START: pea TTLMES(pc) + DOS _PRINT + addq.l #4,sp + lea 16(a0),a0 + move.l a0,-(sp) + move.l -8(a0),-(sp) + lea WK,a6 + moveq #0,d7 + moveq #0,d6 + not.w d6 + moveq #0,d5 + move.b (a2)+,d0 + beq CMDSET + bsr OPTGET + beq CMDSET + andi.w #$FF3F,d7 + + tst.w d7 + bmi USAGE + btst #14,d7 + beq CMDSET + + bsr KEEPCK * 常駐解除 + bmi ERR8 + subq.w #3,d0 + bcs ERR5 + subq.w #2,d0 + bcc ERR5 + moveq #$FF,d0 + trap #2 + addq.l #1,d0 + beq ERR7 + addq.l #1,d0 + beq ERR6 + moveq #0,d0 + lea RELMES(pc),a0 + bra ERRRTN + +CMDSET: bsr KEEPCK * 常駐開始 + bmi ERR8 + beq CMDKEP + subq.w #2,d0 + bcs CMDSE1 + beq CMDSE5 + subq.w #1,d0 + beq CMDSE2 + subq.w #2,d0 + bcc ERR2 + tst.w d7 * PCM8が常駐している + beq ERR2 + bra CMDSE3 + +CMDSE1: movem.l d6-d7,-(sp) * 常駐がはずれているので常駐する + pea $0000.w + DOS _SUPER + move.l d0,(sp) + jsr (a0) + tst.w (sp) + bmi CMDSE4 + DOS _SUPER +CMDSE4: addq.l #4,sp + movem.l (sp)+,d6-d7 +CMDSE5: bsr VCTSET + bne ERR4 + bsr PSTOPS + move.w d7,d0 + beq NERRTN + bra CMDSE3 + +CMDSE2: move.w #$3F2F,D0 * 常駐済 + and.w d7,d0 + beq ERR4 +CMDSE3: bsr CNGMOD + bra CMDCNG + +CMDKEP: bsr SYSMOD * 常駐処理開始 + bclr #0,SYSFLG-WK(a6) + bsr ADRFIX + bmi CMDKER + bsr XMOVE + bmi CMDKER + bsr CACCLR + lea CMDKE2(pc),a0 + adda.l d0,a0 + jmp (a0) +CMDKE2: bsr INIT + bsr CACCLR + bsr VCTINI + bsr PSTOPS + bsr VCTSET + bsr CNGMOD + lea CHKFLG,a0 * 先頭に疑似認識情報を置く + lea TOPADR,a1 + move.l (a0)+,(a1)+ + move.l (a0)+,(a1)+ + move.w #$6000,(a1)+ + suba.l a1,a0 + move.w a0,(a1) + tst.l d5 + beq CMDKE3 + move.l d5,-(sp) + DOS _MFREE + addq.l #4,sp + tst.l d0 + bmi CMDKER +CMDKE3: movem.l (sp)+,a0-a1 + lea -$F0(a4),a4 + suba.l a1,a4 + move.w #0,-(sp) + move.l a4,-(sp) + DOS _KEEPPR + +STDISP: bsr P8ACHK + cmpi.b #3,d0 + bne ERR9 + move.w #$01FC,d0 * 動作モード + moveq #-1,d1 + trap #2 + lea STAM01(pc),a0 + lea STAMB0(pc),a1 + bsr SERCPY + move.w #$01FA,d0 + moveq #-1,d1 * 動作状況表示 + trap #2 + move.l d0,d2 + moveq #-1,d0 + tst.l d2 + bmi STDI02 + moveq #0,d0 + btst #27,d2 + beq STDI02 + moveq #1,d0 +STDI02: lea STAM02(pc),a0 + lea STAMB0(pc),a1 + bsr SERCPY + moveq #-1,d0 * 音量可変 + tst.l d2 + bmi STDI04 + moveq #0,d0 + btst #26,d2 + beq STDI04 + btst #25,d2 + beq STDI04 + moveq #1,d0 +STDI04: lea STAM03(pc),a0 + lea STAMB0(pc),a1 + bsr SERCPY + moveq #-1,d0 * IOCSチャンネル数 + tst.l d2 + bmi STDI05 + move.l d2,d0 + swap d0 + andi.w #$FF,d0 +STDI05: lea STAN01(pc),a0 + bsr DECCNV + moveq #-1,d0 * 有効チャンネル数 + tst.l d2 + bmi STDI06 + move.l d2,d0 + lsr.w #8,d0 +STDI06: lea STAN02(pc),a0 + bsr DECCNV + move.w #$01F9,d0 * 処理バイト数 + trap #2 + move.l d0,d1 + moveq #-1,d0 + tst.l d1 + bmi STDI07 + move.l d1,d0 + swap d0 +STDI07: lea STAN03(pc),a0 + bsr DECCNV + moveq #-1,d0 * 最大音量 + tst.l d1 + bmi STDI08 + moveq #0,d0 + move.b d1,d0 +STDI08: lea STAH01(pc),a0 + bsr HEXCNV + moveq #-1,d0 * 最小音量 + tst.l d1 + bmi STDI09 + move.w d1,d0 + lsr.w #8,d0 +STDI09: lea STAH02(pc),a0 + bsr HEXCNV + move.w #$01F7,d0 * ADPCM動作モード + moveq #-1,d1 + trap #2 + move.l d0,d1 + moveq #-1,d0 + tst.l d1 + bmi STDI10 + move.w d1,d0 + lsr.w #8,d0 +STDI10: lea STAN10(pc),a0 + bsr DECCNV + moveq #-1,d0 * ADPCM動作周波数 + tst.l d1 + bmi STDI11 + moveq #0,d0 + move.b d1,d0 + subq.b #4,d0 + andi.b #7,d0 +STDI11: lea STAM10(pc),a0 + lea STAMF0(pc),a1 + bsr SERCPY + moveq #0,d0 * 常駐モード + tst.l d2 + bmi STDI12 + btst #24,d2 + beq STDI12 + moveq #1,d0 +STDI12: lea STAM11(pc),a0 + lea STAMJ0(pc),a1 + bsr SERCPY + move.w #$01FF,d0 * PCM8占有 + trap #2 + move.l d0,d1 + bne STDI13 + move.w #$01FE,d0 + trap #2 +STDI13: moveq #0,d0 + tst.l d1 + bne STDI14 + moveq #1,d0 +STDI14: lea STAM04(pc),a0 + lea STAMB0(pc),a1 + bsr SERCPY + move.w #$7F11,d0 * MPCM占有 + trap #2 + tst.l d0 + bmi STDI23 + movea.l d0,a3 + move.w #$7F12,d0 + trap #2 + move.l d0,d3 + bmi STDI23 + move.l d3,d2 + swap d2 + movea.l a3,a2 + moveq #0,d1 + bra STDI22 +STDI21: movea.l a2,a1 + IOCS _B_BPEEK + or.b d0,d1 + adda.w d3,a2 +STDI22: dbne d2,STDI21 + moveq #0,d0 + tst.b d1 + beq STDI24 + moveq #1,d0 + bra STDI24 +STDI23: moveq #-1,d0 +STDI24: lea STAM05(pc),a0 + lea STAMB0(pc),a1 + bsr SERCPY + move.l d0,d1 + lea STAMES(pc),a0 * ステータス表示 + move.l a0,(sp) + DOS _PRINT + subq.l #1,d1 + bne STDI30 + lea MPCMES(pc),a0 * MPCM占有プログラム名 + move.l a0,(sp) + DOS _PRINT + lea WKBUF(pc),a4 + lea CRLF(pc),a5 + bra STDI29 +STDI25: swap d3 + movea.l a4,a2 + movea.l a3,a1 + move.w d3,d2 + cmpi.w #WKSIZ,d2 + bcs STDI27 + move.w #WKSIZ-1,d2 + bra STDI27 +STDI26: IOCS _B_BPEEK + move.b d0,(a2)+ +STDI27: dbeq d2,STDI26 + clr.b (a2) + tst.b (a4) + beq STDI28 + move.l a4,(sp) + DOS _PRINT + move.l a5,(sp) + DOS _PRINT +STDI28: adda.w d3,a3 +STDI29: swap d3 + dbra d3,STDI25 +STDI30: bra NERRTN + +SERCPY: movem.l d0-d1/a0-a2,-(sp) + movea.l a1,a2 + bra SERCP3 +SERCP1: movea.l a1,a2 +SERCP2: move.b (a1)+,d1 + bne SERCP2 +SERCP3: move.b (a1),d1 + dbeq d0,SERCP1 + bne SERCP5 + movea.l a2,a1 + bra SERCP5 +SERCP4: move.b d1,(a0)+ +SERCP5: move.b (a1)+,d1 + bne SERCP4 + movem.l (sp)+,d0-d1/a0-a2 + rts + +CMDCLR: lea CLRMES(pc),a0 + bra CMDCN1 + +CMDCNG: bclr #13,d7 + tst.w d7 + beq CMDCLR + btst #12,d7 + beq CMDCN2 + cmpi.l #$0000FFFF,d6 + beq STDISP +CMDCN2: lea CNGMES(pc),a0 +CMDCN1: moveq #0,d0 + bra ERRRTN + +USAGE: lea USEMES(pc),a0 + moveq #1,d0 + bra ERRRTN + +ERR2: lea KERMES(pc),a0 + moveq #2,d0 + bra ERRRTN + +CMDKER: movem.l d5/a4,-(sp) + pea 0.w + DOS _SUPER + move.l d0,(sp) + jsr VCTRTN + tst.w (sp) + bmi ERR31 + DOS _SUPER +ERR31: addq.l #4,sp + movem.l (sp)+,d5/a4 + tst.l d5 + beq ERR3 + move.l d5,-(sp) + DOS _MFREE + addq.l #4,sp +ERR3: lea KEMMES(pc),a0 + moveq #3,d0 + bra ERRRTN + +ERR4: lea KRDMES(pc),a0 + moveq #4,d0 + bra ERRRTN + +ERR5: lea REXMES(pc),a0 + moveq #5,d0 + bra ERRRTN + +ERR6: lea RERMES(pc),a0 + moveq #6,d0 + bra ERRRTN + +ERR7: lea RENMES(pc),a0 + moveq #7,d0 + bra ERRRTN + +ERR8: lea DERMES(pc),a0 + moveq #8,d0 + bra ERRRTN + +ERR9: lea OTHMES(pc),a0 + moveq #9,d0 + +ERRRTN: move.l a0,(sp) + DOS _PRINT +NERRTN: addq.l #6,sp + move.w d0,(sp) + DOS _EXIT2 + +KEEPCK: move.l d1,-(sp) * 常駐チェック + pea $0000.w + DOS _SUPER + move.l d0,(sp) + bsr KEPCHK + bne KEEPC1 + bsr DKPCHK +KEEPC1: move.l d0,d1 + tst.w (sp) + bmi KEEPC2 + DOS _SUPER +KEEPC2: addq.l #4,sp + move.l d1,d0 + movem.l (sp)+,d1 + rts + +KEPCHK: move.l d1,-(sp) * 飛び先チェックによる常駐チェック + moveq #0,d1 * 0:常駐していない + lea T1VECA.w,a0 * trap #1 の飛び先チェック + movea.l (a0),a0 + subq.l #8,a0 + move.l (a0)+,d0 + cmpi.l #MPCMOK,d0 + beq KEPC02 + cmpi.l #PCM8NG,d0 + bne KEPC03 +KEPC02: moveq #5,d1 * 5:組み込み拒否(MPCM常駐) +KEPC03: lea T2VECA.w,a0 * trap #2 の飛び先チェック + movea.l (a0),a0 + cmpa.l #$00F00000,a0 + bcc KEPCH1 + moveq #5,d1 * 5:組み込み拒否 +KEPCH1: move.l a0,d0 + swap d0 + andi.w #$FFF0,d0 + cmpi.w #$22F0,d0 + beq KEPCH2 + moveq #5,d1 +KEPCH2: subq.l #8,a0 + move.l (a0)+,d0 + cmpi.l #PCM8OK,d0 + beq KEPCH3 + cmpi.l #PCM8NG,d0 + bne KEPCHE + cmpi.l #'/048',(a0) + bne KEPCHE + lea -12(a0),a0 + cmpi.l #PCM8OK,(a0)+ + bne KEPCHE + cmpi.b #'A',(a0) + bne KEPCHE + moveq #2,d1 * 2:常駐していない(trap #2 は接続) + bra KEPCHE +KEPCH3: cmpi.l #'/048',(a0) + bne KEPCHE + moveq #4,d1 * 4:他の PCM8 が常駐している + lea -12(a0),a0 + cmpi.l #PCM8OK,(a0)+ + bne KEPCHE + cmpi.b #'A',(a0) + bne KEPCHE + moveq #3,d1 * 3:常駐済 +KEPCHE: move.l d1,d0 + movem.l (sp)+,d1 + rts + +DKPCHK: movem.l d1-d3/a1-a4,-(sp) * デバイスドライバ名でチェック + moveq #-1,d3 + bsr NULSRC + cmp.l d3,d0 + beq DKPCH5 + movea.l d0,a3 + moveq #8-1,d0 + moveq #2-1,d2 + lea DEVNA1(pc),a1 +DKPCH1: movea.l a3,a2 +DKPCH2: move.l (a2),d1 + cmp.l d3,d1 + beq DKPCH3 + movea.l d1,a2 + lea 14(a2),a0 * デバイス名チェック + bsr STRCMP + bne DKPCH2 + addq.l #8,a0 + movem.l d0/a1,-(sp) * PCM8A ヘッダ文字チェック + lea HEADD1,a1 + moveq #HEADD2-HEADD1-1,d0 + bsr STRCMP + movem.l (sp)+,d0/a1 + bne DKPCH2 + movea.l HEADD2-HEADD1(a0),a2 * trap #2 接続処理アドレス + moveq #1,d0 * 1:常駐が外れている + bra DKPCH4 +DKPCH3: addq.l #8,a1 + dbra d2,DKPCH1 + moveq #0,d0 * 0:常駐していない +DKPCH4: movea.l a2,a0 +DKPCH5: tst.l d0 + movem.l (sp)+,d1-d3/a1-a4 + rts + +NULSRC: movem.l d1/a0-a1,-(sp) * NULL デバイスのサーチ + moveq #-1,d1 + lea HUTOP-1.w,a0 + lea DEVNUL,a1 +NULSR1: addq.l #1,a0 + moveq #8-2,d0 + bsr STRSRC + move.l a0,d0 + sub.l a1,d0 + beq NULSR2 + cmpi.w #$8024,-10(a0) + bne NULSR1 + lea -14(a0),a0 + move.l a0,d1 +NULSR2: move.l d1,d0 + movem.l (sp)+,d1/a0-a1 + rts + +STRSRC: movem.l d1-d3/a1-a3,-(sp) * 文字列サーチ + move.b (a1)+,d1 +STRSR1: cmp.b (a0)+,d1 + bne STRSR1 + movea.l a1,a3 + movea.l a0,a2 + move.w d0,d2 +STRSR2: move.b (a3)+,d3 + cmp.b (a2)+,d3 + dbne d2,STRSR2 + bne STRSR1 + subq.l #1,a0 + movem.l (sp)+,d1-d3/a1-a3 + rts + +STRCMP: movem.l d0/a0-a1,-(sp) * 文字列比較 +STRCM1: move.b (a1)+,d1 + cmp.b (a0)+,d1 + dbne d0,STRCM1 + movem.l (sp)+,d0/a0-a1 + rts + +XMOVE: movem.l d1/a0-a1,-(sp) * プログラム移動 + lea LASTAD(pc),a0 + move.l #LASTAD-TBLTOP+16,d1 + lea (a4,d1.l),a1 + btst #4,d7 + beq XMOVE1 + move.l d1,-(sp) + DOS _MALLOC + addq.l #4,sp + tst.l d0 + bmi XMOVE4 + move.l d0,d5 + add.l d1,d0 + movea.l d0,a1 + sub.l a0,d0 + bra XMOVE2 +XMOVE1: move.l a1,d0 + sub.l a0,d0 + bhi XMOVE2 + moveq #0,d0 + bra XMOVE4 +XMOVE2: addq.l #7,d1 + lsr.l #3,d1 + subq.w #3,d1 +XMOVE3: move.l -(a0),-(a1) + move.l -(a0),-(a1) + dbra d1,XMOVE3 + moveq #0,d1 +XMOVE4: movem.l (sp)+,d1/a0-a1 + rts + +OPTGET: movem.l d1-d5/a0-a1,-(sp) * オプション処理 + moveq #0,d5 +OPTGS: bsr SPCSKP + tst.b d0 + beq OPTGEE + cmpi.w #'/',d0 + beq OPTG1 + cmpi.w #'-',d0 + bne OPTSW +OPTG1: bsr CHRGET +OPTG0: tst.b d0 + beq OPTGEE + cmpi.w #' ',d0 + bls OPTGS + cmpi.w #'/',d0 + beq OPTG1 + cmpi.w #'-',d0 + beq OPTG1 + bsr CAPCNG + cmpi.w #'R',d0 + bne OPTG2 + ori.w #$4000,d7 + bra OPTG1 +OPTG2: cmpi.w #'D',d0 * 動作表示 + bne OPTG3 + move.w #$0C00,d2 + move.w #$0800,d3 + bra OPTSUB +OPTG3: cmpi.w #'V',d0 * 音量可変 + bne OPTG4 + move.w #$0300,d2 + move.w #$0200,d3 + bra OPTSUB +OPTG4: cmpi.w #'I',d0 * IOCSチャンネル + bne OPTG5 + bsr NUMGET + beq OPTG0 + swap d7 + move.b d1,d7 + swap d7 + ori.w #$0020,d7 + bra OPTG0 +OPTG5: cmpi.w #'N',d0 * デバイスドライバ名 + bne OPTG6 + move.w #$00C0,d2 + move.w #$0080,d3 + bra OPTSUB +OPTG6: cmpi.w #'S',d0 * システム情報 + bne OPTG7 + ori.w #$1000,d7 + bsr NUMGET * チャンネル数 + beq OPTG61 + rol.l #8,d6 + move.b d1,d6 + ror.l #8,d6 +OPTG61: bsr SEPCHK + bne OPTG0 + bsr NUMGET * 処理ブロック数 + beq OPTG63 + swap d6 + move.b d1,d6 + swap d6 +OPTG63: bsr SEPCHK + bne OPTG0 + bsr NUMGET * 最小音量 + beq OPTG65 + move.b d1,d6 +OPTG65: bsr SEPCHK + bne OPTG0 + bsr NUMGET * 最大音量 + beq OPTG67 + ror.w #8,d6 + move.b d1,d6 + rol.w #8,d6 +OPTG67: bra OPTG0 +OPTG7: cmpi.w #'M',d0 * 周波数モード + bne OPTG8 + ori.w #$0008,d7 + lsl.l #4,d7 + bsr CAPGET + cmpi.w #'0',d0 + bcs OPTG73 + cmpi.w #'4',d0 + bhi OPTG71 + subi.w #'0',d0 + add.b d0,d7 + bra OPTG72 +OPTG71: cmpi.w #'A',d0 + bne OPTG73 + addq.b #8,d7 +OPTG72: ror.l #4,d7 + bra OPTG1 +OPTG73: addq.b #7,d7 + ror.l #4,d7 + bra OPTG0 +OPTG8: cmpi.w #'F',d0 * 基準周波数 + bne OPTG9 + ori.w #$0004,d7 + rol.l #8,d7 + andi.w #$FFF0,d7 + bsr CAPGET + cmpi.w #'0',d0 + bcs OPTG83 + cmpi.w #'3',d0 + beq OPTG83 + cmpi.w #'7',d0 + bhi OPTG81 + subi.w #'0',d0 + add.b d0,d7 + bra OPTG82 +OPTG81: cmpi.w #'A',d0 + bne OPTG83 + addi.b #9,d7 +OPTG82: ror.l #8,d7 + bra OPTG1 +OPTG83: addq.b #8,d7 + ror.l #8,d7 + bra OPTG0 +OPTG9: cmpi.w #'W',d0 * ワークアドレス指定 + bne OPTGA +OPTG91: moveq #1,d3 + bsr NUMGET + move.b d1,d4 + bsr SEPCHK + bne OPTG92 + bsr NUMGET + beq OPTG92 + moveq #$80,d3 +OPTG92: tst.b d4 + beq OPTG95 + lea WKADF1-WK(a6),a0 + moveq #WKCNT-1,d2 +OPTG93: lsr.b #1,d4 + bcc OPTG94 + move.b d3,(a0) + move.b d5,1(a0) + move.l d1,2(a0) +OPTG94: lea 10(a0),a0 + dbra d2,OPTG93 +OPTG95: ori.w #$0010,d7 + addq.b #1,d5 + bsr SEPCHK + beq OPTG91 + bra OPTG0 +OPTGA: cmpi.w #'Z',d0 * テーブル再作成 + bne OPTGB + ori.w #$2000,d7 * CLR + bsr P8ACHK + cmpi.b #3,d0 + bne OPTG1 + move.w #$7F10,d0 + trap #2 + tst.l d0 + bmi OPTG1 + move.l d0,d1 + lea CHKFLG-8,a0 + movea.l d1,a1 + lea CHKFLG-8-WK(a1),a1 + IOCS _B_LPEEK + cmp.l (a0)+,d0 + bne OPTG1 + IOCS _B_LPEEK + cmp.l (a0)+,d0 + bne OPTG1 + move.w #$0103,d0 + trap #2 + move.l a6,-(sp) + pea $0000.w + DOS _SUPER + move.l d0,(sp) + movea.l d1,a6 + bsr INIT2 + tst.w (sp) + bmi OPTGA5 + DOS _SUPER +OPTGA5: addq.l #4,sp + movea.l (sp)+,a6 + bra OPTG1 +OPTGB: tst.b d0 + beq OPTGEE +OPTGER: ori.w #$8000,d7 +OPTGEE: movem.l (sp)+,d1-d5/a0-a1 + tst.w d7 + rts + +OPTSUB: or.w d2,d7 + bsr CHRGET + cmpi.w #'0',d0 + bcs OPTG0 + cmpi.w #'1',d0 + bhi OPTG0 + eor.w d3,d7 + cmpi.w #'0',d0 + beq OPTG1 + eor.w d2,d7 + bra OPTG1 + +OPTSW: bsr CAPCNG + cmpi.w #'O',d0 + bne OPTSW2 + bsr CAPGET + cmpi.w #'F',d0 + bne OPTSW1 + bsr CAPGET + cmpi.w #'F',d0 + bne OPTGER + andi.w #$FFFC,d7 * OFF + addq.b #1,d7 + bra OPTGS +OPTSW1: cmpi.w #'N',d0 + bne OPTGER + andi.w #$FFFC,d7 * ON + addq.b #2,d7 + bra OPTGS +OPTSW2: cmpi.w #'F',d0 + bne OPTSW3 + bsr CAPGET + cmpi.w #'N',d0 + bne OPTGER + bsr CAPGET + cmpi.w #'C',d0 + bne OPTGER + andi.w #$FFFC,d7 * FNC + addq.b #3,d7 + bra OPTGS +OPTSW3: cmpi.w #'C',d0 + bne OPTSWE + bsr CAPGET + cmpi.w #'L',d0 + bne OPTGER + bsr CAPGET + cmpi.w #'R',d0 + bne OPTGER + ori.w #$2000,d7 * CLR + bra OPTGS +OPTSWE: tst.b d0 + beq OPTGEE + bra OPTGER + +NUMGET: movem.l d2-d3,-(sp) * 数値取り込み + moveq #0,d1 + moveq #0,d2 + bsr CHRGET + beq NUMGEE + cmpi.w #'0',d0 + bcs NUMG20 + cmpi.w #'9',d0 + bhi NUMG20 +NUMGE1: addq.w #1,d2 + subi.w #'0',d0 + ext.l d0 + move.l d1,d3 + add.l d1,d1 + add.l d1,d1 + add.l d3,d1 + add.l d1,d1 + add.l d0,d1 + bsr CHRGET + beq NUMGEE + cmpi.w #'0',d0 + bcs NUMGEE + cmpi.w #'9',d0 + bls NUMGE1 +NUMGEE: tst.w d2 + movem.l (sp)+,d2-d3 + rts + +NUMG20: cmpi.w #'$',d0 + beq NUMG21 + bsr CAPCNG + cmpi.w #'X',d0 + bne NUMGEE +NUMG21: bsr CAPGET + beq NUMGEE + cmpi.w #'0',d0 + bcs NUMGEE + cmpi.w #'9',d0 + bls NUMG22 + cmpi.w #'A',d0 + bcs NUMGEE + cmpi.w #'F',d0 + bhi NUMGEE + subi.w #'A'-'9'-1,d0 +NUMG22: addq.w #1,d2 + subi.w #'0',d0 + ext.l d0 + lsl.l #4,d1 + or.l d0,d1 + bra NUMG21 + +SEPCHK: cmpi.w #',',d0 + beq SEPCH1 + cmpi.w #':',d0 + beq SEPCH1 + cmpi.w #';',d0 + beq SEPCH1 + cmpi.w #'.',d0 +SEPCH1: rts + +CAPGET: bsr CHRGET +CAPCNG: cmpi.w #'a',d0 + bcs CAPCNE + cmpi.w #'z',d0 + bhi CAPCNE + subi.w #$20,d0 +CAPCNE: rts + +SPCSKP: bsr CHRGET +SPCSK0: tst.b d0 + beq SPCSKE + cmpi.w #$20,d0 + bls SPCSKP +SPCSKE: tst.b d0 + rts + +CHRGET: clr.w d0 + move.b (a2)+,d0 + bpl CHRGEE + cmpi.b #$A0,d0 + bcs CHRGE1 + cmpi.b #$E0,d0 + bcs CHRGEE +CHRGE1: move.b d0,-(sp) + move.w (sp)+,d0 + move.b (a2)+,d0 +CHRGEE: tst.b d0 + rts + +*-------------------------------------------------------------------- +* デバイスドライバ登録時の実行部 + +DEVSET: movem.l d1-d7/a0-a6,-(sp) + lea WK,a6 + pea $0000.w + move.w #$6004,DEVINI * 初期化処理部へ飛ばないようにする + movea.l 18(a5),a2 +DEVSE1: move.b (a2)+,d0 + bne DEVSE1 + moveq #0,d7 + moveq #0,d6 + not.w d6 + bra DEVSE3 +DEVSE2: bsr OPTGET + tst.w d7 + bmi DEVER1 +DEVSE3: tst.b (a2) + bne DEVSE2 + tst.w d7 + bmi DEVER1 + lea WKADF1-WK(a6),a0 + bclr #4,d7 + moveq #$80,d0 + moveq #WKCNT-1,d1 +DEVSE4: and.b d0,(a0) + lea 10(a0),a0 + dbra d1,DEVSE4 + + bsr KEEPCK + bmi DEVER4 + beq DEVSTA + subq.w #2,d0 + bcs DEVSE5 + beq DEVSE8 + subq.w #2,d0 + bcs DEVSE6 + bra DEVER2 + +DEVSE5: jsr (a0) * 常駐が外れていた +DEVSE8: bsr VCTSET + bne DEVER3 + bsr PSTOPS + bsr CNGMOD + btst #14,d7 + bne DEVCNG + bra DEVCN2 + +DEVSE6: move.w #$3F2F,D0 * 常駐済 + and.w d7,d0 + beq DEVER3 + bsr CNGMOD + btst #14,d7 + bne DEVSR1 + bra DEVCNG + +DEVSTA: bsr SYSMOD * 組み込み開始 + bset #0,SYSFLG-WK(a6) + bsr ADRFIX + bmi DEVSER + bsr XMOVE + bmi DEVSER + bsr CACCLR + lea DEVST3(pc),a0 + adda.l d0,a0 + jmp (a0) +DEVST3: bsr INIT + bsr CACCLR + bsr VCTINI + bsr PSTOPS + bsr VCTSET + move.l a4,14(a5) + bsr CNGMOD + moveq #0,d1 + lea DEVNA1(pc),a1 + moveq #$80,d0 + and.b d7,d0 + beq DEVST4 + lea DEVNA2(pc),a1 +DEVST4: lea DEVNAM,a0 + moveq #8-1,d0 +DEVST5: move.b (a1)+,(a0)+ + dbra d0,DEVST5 + bra DEVCN3 + +DEVSR1: addq.l #1,d0 + beq DEVSR2 + bmi DEVSR3 + lea DOTMES(pc),a0 * 解除 + bra DEVCN1 + +DEVSR2: lea RENMES(pc),a0 * 解除禁止 + bra DEVCN1 + +DEVSR3: lea DOEMES(pc),a0 * 解除出来ず + bra DEVCN1 + +DEVER1: lea SWEMES(pc),a0 * スイッチ誤り + bra DEVCN1 + +DEVER2: lea DIEMES(pc),a0 * 組込拒否 + bra DEVCN1 + +DEVER3: lea DRDMES(pc),a0 * 組込済 + bra DEVCN1 + +DEVSER: jsr VCTRTN +DEVER4: lea DERMES(pc),a0 * 組込不可 + bra DEVCN1 + +DEVCLR: lea CLRMES(pc),a0 * 初期化 + bra DEVCN1 + +DEVCNG: bclr #13,d7 + tst.w d7 + beq DEVCLR + lea CNGMES(pc),a0 * 設定変更 +DEVCN1: move.l a0,(sp) +DEVCN2: move.w #$500C,d1 +DEVCN3: pea TTLME1(pc) +DEVCN4: DOS _PRINT + addq.l #4,sp + tst.l (sp) + beq DEVSEP + DOS _PRINT +DEVSEP: addq.l #4,sp + moveq #0,d0 + move.w d1,d0 + movem.l (sp)+,d1-d7/a0-a6 + rts + +*-------------------------------------------------------------------- +* 初期化処理ルーチン + +PSTOPS: move.l d0,-(sp) * 強制停止 + move.w #$0101,d0 + trap #2 + move.w #$0100,d0 + trap #2 + move.l (sp)+,d0 + rts + +CACCLR: movem.l d0-d1/a1,-(sp) * キャッシュクリア + lea MPUFLG.w,a1 + IOCS _B_BPEEK + cmpi.b #2,d0 + bcs CACCL1 + moveq #3,d1 + moveq #$AC,d0 + trap #15 +CACCL1: movem.l (sp)+,d0-d1/a1 + rts + +SYSMOD: movem.l d0-d1,-(sp) * 常駐時システム状態設定 + btst #12,d7 + beq SYSMOE + moveq #0,d0 + move.b d6,d0 * 音量最小値 + cmpi.b #$FF,d0 + beq SYSM12 + cmpi.b #15,d0 + bhi SYSM11 + move.b PCMXT4-WK(a6,d0.w),d0 +SYSM11: cmpi.b #VOLMN2,d0 + bcc SYSM13 +SYSM12: move.b #VOLMN2,d0 +SYSM13: cmpi.b #VOLMX2,d0 + bls SYSM21 + move.b #VOLMX2,d0 +SYSM21: move.w d6,d1 * 音量最大値 + lsr.w #8,d1 + cmpi.b #$FF,d1 + beq SYSM24 + cmpi.b #15,d1 + bhi SYSM22 + move.b PCMXT4-WK(a6,d1.w),d1 +SYSM22: cmpi.b #VOLMN2,d1 + bcc SYSM23 + move.b #VOLMN2,d1 +SYSM23: cmpi.b #VOLMX2,d1 + bls SYSM31 +SYSM24: move.b #VOLMX2,d1 +SYSM31: cmp.b d0,d1 + bcc SYSM32 + exg d0,d1 +SYSM32: movem.w d0-d1,VOLMIN-WK(a6) + cmp.w VOLMN0-WK(a6),d0 + bls SYSM33 + move.w d0,VOLMN0-WK(a6) +SYSM33: cmp.w VOLMX0-WK(a6),d1 + bcc SYSM34 + move.w d1,VOLMX0-WK(a6) +SYSM34: swap d6 + move.w d6,d0 * 処理ブロック数 + andi.w #$00FF,d0 + bne SYSM41 + move.b #PCMBI2/12,d0 + bra SYSM42 +SYSM41: cmpi.b #PCMBIX/12,d0 + bls SYSM42 + move.b #PCMBIX/12,d0 +SYSM42: move.w d0,PCMBNX-WK(a6) + cmp.w PCMBN0-WK(a6),d0 + bcc SYSM43 + move.w d0,PCMBN0-WK(a6) + move.w d0,PCMBN1-WK(a6) +SYSM43: move.w d0,d1 + add.w d0,d0 + add.w d1,d0 + lsl.w #2,d0 + move.w d0,PCMBMX-WK(a6) + cmp.w PCMBL0-WK(a6),d0 + bcc SYSM44 + move.w d0,PCMBL0-WK(a6) + move.w d0,PCMBL1-WK(a6) + move.w d0,PCMBR0-WK(a6) + move.w d0,PCMBR1-WK(a6) + move.w d0,PCMBR2-WK(a6) +SYSM44: move.w d6,d0 * チャンネル数 + lsr.w #8,d0 + bne SYSM51 + move.b #PCMCI2,d0 * 無指定ならデフォルト +SYSM51: cmpi.b #PCMCIN,d0 * 最小値以下なら最小値 + bcc SYSM52 + move.b #PCMCIN,d0 +SYSM52: cmpi.b #PCMCIX,d0 * 最大値以上なら最大値 + bls SYSM53 + move.b #PCMCIX,d0 +SYSM53: move.w d0,PCMCMX-WK(a6) + cmp.w PCMCHN-WK(a6),d0 + bcc SYSM54 + move.w d0,PCMCHN-WK(a6) +SYSM54: move.w PCMCHN-WK(a6),d0 * IOCSチャンネル数 + cmp.b IOCHMX-WK(a6),d0 + bls SYSM55 + move.b IOCHMX-WK(a6),d0 +SYSM55: move.b d0,IOCHN-WK(a6) + swap d6 +SYSMOE: movem.l (sp)+,d0-d1 + rts + +CNGMOD: movem.l d1/a5-a6,-(sp) * 設定変更 + tst.w d7 + beq CNGMOE + moveq #$C,d1 + and.w d7,d1 + beq CNGM11 + bsr CNGFRQ * 周波数変更 +CNGM11: move.w d7,d1 * 動作状況表示 + andi.w #$0C00,d1 + beq CNGM21 + rol.w #6,d1 + subq.w #1,d1 + move.w #$7F00,d0 + trap #2 +CNGM21: move.w d7,d1 * 音量可変 + andi.w #$0300,d1 + beq CNGM31 + lsr.w #8,d1 + subq.w #1,d1 + move.w #$7F04,d0 + trap #2 +CNGM31: btst #12,d7 * PCM8Aシステム情報 + beq CNGM41 + bsr P8ACHK + cmpi.b #2,d0 + bcs CNGM41 + cmpi.b #4,d0 + bcc CNGM41 + move.l d6,d1 + move.w #$01F8,d0 + trap #2 +CNGM41: btst #5,d7 * IOCSチャンネル数 + beq CNGM51 + move.l d7,d1 + swap d1 + andi.w #$00FF,d1 + move.w #$7F03,d0 + trap #2 +CNGM51: moveq #3,d1 * 単音再生モード設定 + and.b d7,d1 + beq CNGM61 + subq.w #1,d1 + move.w #$7F02,d0 + trap #2 +CNGM61: btst #13,d7 * 内部初期化 + beq CNGM71 + bsr P8ACHK + cmpi.b #2,d0 + bcs CNGM71 + cmpi.b #4,d0 + bcc CNGM611 + moveq #$F1,d0 + trap #2 + bra CNGM71 +CNGM611: + bne CNGM71 + pea $0000.w + DOS _SUPER + move.l d0,(sp) + jsr DMASTP + tst.w (sp) + bmi CNGM612 + DOS _SUPER +CNGM612: + addq.l #4,sp + move.w #$0101,d0 + trap #2 + move.w #$0100,d0 + trap #2 +CNGM71: btst #14,d7 * 組み込み解除 + beq CNGMOE + moveq #$FF,d0 + trap #2 +CNGMOE: movem.l (sp)+,d1/a5-a6 + rts + +CNGFRQ: movem.l d0-d3,-(sp) * 基準周波数変更 + bsr P8ACHK + cmpi.b #2,d0 + bcs CNGFRE + cmpi.b #4,d0 + bcc CNGFRE + moveq #-1,d1 + move.w #$01F7,d0 + trap #2 + tst.l d0 + bmi CNGFRE + move.w d0,d3 + moveq #0,d1 + btst #3,d7 + bne CNGF11 + ror.w #8,d0 + move.b d0,d1 + rol.w #8,d0 + bra CNGF21 +CNGF11: moveq #$F,d1 + rol.l #4,d7 + and.b d7,d1 + ror.l #4,d7 +CNGF21: moveq #0,d2 + btst #2,d7 + bne CNGF22 + move.b d0,d2 + bra CNGF31 +CNGF22: moveq #$F,d2 + rol.l #8,d7 + and.b d7,d2 + ror.l #8,d7 +CNGF31: cmpi.b #7,d1 + bne CNGF41 + bsr ENVCHK * 環境変数チェック + move.b d0,d1 +CNGF41: cmpi.b #8,d1 + bcs CNGF51 + bsr AUTMOD * 自動判定 + move.b d0,d1 +CNGF51: cmpi.b #3,d2 + beq CNGF52 + cmpi.b #8,d2 + bcs CNGF61 +CNGF52: moveq #0,d2 * 最大周波数 + tst.b d1 + beq CNGF61 + moveq #2,d2 +CNGF61: ext.l d1 + lsl.w #8,d1 + move.b d2,d1 + cmp.w d1,d3 + beq CNGFRE + move.w #$01F7,d0 + trap #2 +CNGFRE: movem.l (sp)+,d0-d3 + rts + +ENVCHK: movem.l d1/a1-a2,-(sp) * 環境変数チェック + btst #0,SYSFLG-WK(a6) + bne ENVCER + movea.l #$1800+$53*4,a1 + IOCS _B_LPEEK + move.l d0,d1 + movea.l #$1800+$83*4,a1 + IOCS _B_LPEEK + pea WKBUF(pc) + pea 0.w + pea ADPMOD(pc) + cmp.l d0,d1 + beq ENVC01 + .dc.w $FF53 * DOS _GETENV + bra ENVC02 +ENVC01: .dc.w $FF83 * DOS _GETENV (Human v3以降) +ENVC02: lea 12(sp),sp + moveq #0,d1 + lea WKBUF(pc),a2 + bsr SPCSKP + beq ENVCHE * なし:MODE0 + cmpi.w #'4',d0 + bne ENVC21 + bsr SPCSKP + beq ENVCHE * 4:MODE0 + cmpi.w #',',d0 + beq ENVC11 + cmpi.w #'/',d0 + bne ENVCER +ENVC11: bsr SPCSKP + beq ENVCER + cmpi.w #'1',d0 + bne ENVCER + bsr SPCSKP + beq ENVCER + cmpi.w #'6',d0 + bne ENVCER + moveq #2,d1 + bsr SPCSKP + beq ENVCHE * 4/16:MODE2 + bra ENVCER +ENVC21: cmpi.w #'1',d0 + bne ENVC31 + bsr SPCSKP + beq ENVCER + cmpi.w #'6',d0 + bne ENVCER + moveq #1,d1 + bsr SPCSKP + beq ENVCHE * 16:MODE1 + cmpi.w #',',d0 + beq ENVC22 + cmpi.w #'/',d0 + bne ENVCER +ENVC22: bsr SPCSKP + beq ENVCER + cmpi.w #'4',d0 + bne ENVCER + moveq #2,d1 + bsr SPCSKP + beq ENVCHE * 16/4:MODE2 + bra ENVCER +ENVC31: bsr CAPCNG + cmpi.w #'M',d0 + bne ENVC41 + bsr SPCSKP + beq ENVCER + cmpi.w #'0',d0 + bcs ENVCER + cmpi.w #'4',d0 + bhi ENVCER + subi.w #'0',d0 + move.w d0,d1 + bsr SPCSKP + beq ENVCHE * Mn:MODEn + bra ENVCER +ENVC41: moveq #8,d1 + cmpi.w #'A',d0 + bne ENVCER + bsr CAPGET + beq ENVCHE * A:自動判定 + cmpi.w #'U',d0 + bne ENVCER + bsr CAPGET + beq ENVCHE * AU:自動判定 + cmpi.w #'T',d0 + bne ENVCER + bsr CAPGET + beq ENVCHE * AUT:自動判定 + cmpi.w #'O',d0 + bne ENVCER + bsr SPCSKP + beq ENVCHE * AUTO:自動判定 +ENVCER: moveq #0,d1 +ENVCHE: move.l d1,d0 + movem.l (sp)+,d1/a1-a2 + rts + +AUTMOD: movem.l d1-d4/a0-a1/a5,-(sp) * 周波数モード自動判定 + move.w #$0103,d0 + trap #2 + pea 0.w + DOS _SUPER + move.l d0,(sp) + moveq #0,d3 + lea WKBUF(pc),a0 + lea WKBUFE(pc),a1 + move.l a0,d2 + suba.l a0,a1 + move.l a1,d1 + moveq #PCMSPC,d0 + dbra d1,AUTM01 + bra AUTM02 +AUTM01: move.b d0,(a0)+ + dbra d1,AUTM01 +AUTM02: move.l a0,d0 + btst #0,d0 + beq AUTM03 + addq.l #1,a0 +AUTM03: move.l a1,2(a0) + move.l d2,(a0) + move.l a0,6(a0) + lea DMACH3,a5 + move.w sr,d0 + move.w d0,-(sp) + andi.w #$0700,d0 + cmpi.w #$0300,d0 + bcc AUTM10 + ori.w #$0300,sr +AUTM10: move.w #$0200,ADIOCS.w + moveq #REPT,d4 + moveq #2,d0 * 15.6kHz:基準用 + jsr FRQSE0 + bsr AUTMSB + tst.l d0 + beq AUTMER + move.l d0,d1 + move.l d0,d2 + lsr.l #1,d0 + add.l d0,d2 + lsr.l #1,d0 + add.l d0,d1 * D1=D0*5/4 + add.l d0,d2 * D2=D0*7/4 + moveq #$82,d0 * 31.2kHz:M1/M2,7.8kHz:M0/M3/M4 + jsr FRQSE0 + bsr AUTMSB + tst.l d0 + beq AUTMER + cmp.l d1,d0 + shi d3 + add.w d3,d3 + moveq #$81,d0 * 20.8kHz:M1,5.2kHz:M0/M2/M3/M4 + jsr FRQSE0 + bsr AUTMSB + tst.l d0 + beq AUTMER + cmp.l d1,d0 + shi d3 + add.w d3,d3 + moveq #$83,d0 * 7.8kHz:M0,20.8kHz:M2/M4,31.2kHz:M1/M3 + jsr FRQSE0 + bsr AUTMSB + tst.l d0 + beq AUTMER + cmp.l d1,d0 + shi d3 + add.w d3,d3 + cmp.l d2,d0 + shi d3 + lsr.w #7,d3 + moveq #0,d1 + move.b AUTMTB(pc,d3.w),d1 + bra AUTMOE +AUTMER: moveq #0,d1 +AUTMOE: clr.w ADIOCS.w + move.w (sp)+,sr + tst.w (sp) + bmi AUTMOX + DOS _SUPER +AUTMOX: addq.l #4,sp + move.l d1,d0 + movem.l (sp)+,d1-d4/a0-a1/a5 + rts + +AUTMTB: .dc.b 0,0,4,3,0,0,0,0 + .dc.b 0,0,2,0,0,0,0,1 + +AUTMSB: movem.l d1-d6/a0-a1,-(sp) + move.l (a0),d5 + moveq #0,d6 + move.b #1,PCMCNT + move.b #$10,7(a5) + st (a5) + move.l a0,$1C(a5) + move.l #$0E808004,d0 + movep.w d0,4(a5) + swap d0 + movep.w d0,5(a5) + move.b #2,PCMCNT +AUTMS0: IOCS _ONTIME + move.l d0,d2 + moveq #-1,d3 +AUTMS1: IOCS _ONTIME + cmp.l d0,d2 + dbne d3,AUTMS1 + beq AUTMSE + move.l d0,d2 + moveq #-1,d3 +AUTMS2: IOCS _ONTIME + cmp.l d0,d2 + dbne d3,AUTMS2 + beq AUTMSE + move.l $C(a5),d0 + tst.w d0 + beq AUTMS3 + move.l (a0),d1 + cmp.w d0,d1 + bne AUTMS4 +AUTMS3: move.l $C(a5),d0 +AUTMS4: move.l d0,d2 + sub.l d5,d0 + bcc AUTMS5 + moveq #0,d1 + move.w 4(a0),d1 + add.l d1,d0 +AUTMS5: move.l d2,d5 + cmp.l d0,d6 + beq AUTMSX + move.l d0,d6 + dbra d4,AUTMS0 +AUTMSE: moveq #0,d0 +AUTMSX: move.b #1,PCMCNT + move.b #PCMSP2,PCMDAT + move.b #$10,7(a5) + st (a5) + movem.l (sp)+,d1-d6/a0-a1 + rts + +P8ACHK: move.l d1,-(sp) * PCM8Aチェック + pea $0000.w + DOS _SUPER + move.l d0,(sp) + bsr KEPCHK + move.l d0,d1 + tst.w (sp) + bmi P8ACH1 + DOS _SUPER +P8ACH1: addq.l #4,sp + move.l d1,d0 + move.l (sp)+,d1 + rts + +VCTINI: movem.l d0/a1,-(sp) * trap #2 のみ接続 + lea VECTBL-WK(a6),a1 + move.w (a1)+,d0 + move.l (a1)+,-(sp) + move.w d0,-(sp) + DOS _INTVCS + addq.l #6,sp + move.l d0,(a1) + movem.l (sp)+,d0/a1 + rts + +VCTSET: moveq #$FE,d0 * 残りのベクタを接続 + trap #2 + tst.l d0 + rts + +ADRFIX: movem.l d1-d5/a0-a3,-(sp) * ワーク/テーブルアドレスの決定 + lea TBLTOP,a3 * 常駐部の後ろに配置するサイズの決定 + moveq #$80,d0 + bsr SIZCAL + adda.l d0,a3 + lea WKADF1-WK(a6),a0 + moveq #1,d2 +ADRF02: tst.b (a0) + bne ADRF03 + bsr ADRFSB + move.l d0,2(a0) + move.b d2,d0 + bsr SIZCAL + adda.l d0,a3 +ADRF03: lea 10(a0),a0 + rol.b #1,d2 + cmpi.b #WKSNUM,d2 + bls ADRF02 +ADRF05: lea LASTAD(pc),a0 + cmpa.l a0,a3 + bcc ADRF06 + movea.l a0,a3 +ADRF06: movea.l a3,a4 + moveq #0,d0 + btst #0,SYSFLG-WK(a6) + bne ADRF10 + movea.l a3,a1 + lea TOPADR-$F0,a0 + suba.l a0,a1 + movem.l a0-a1,-(sp) + DOS _SETBLOCK + addq.l #8,sp + tst.l d0 + bmi ADRF99 + +ADRF10: lea WKADF1-WK(a6),a0 * 最大値を得る + moveq #0,d1 + moveq #0,d4 + moveq #WKCNT-1,d2 +ADRF11: or.b (a0)+,d1 + move.b (a0)+,d0 + cmp.b d0,d4 + bcc ADRF12 + move.b d0,d4 +ADRF12: addq.l #8,a0 + dbra d2,ADRF11 + + moveq #0,d0 + tst.b d1 + bpl ADRF20 + moveq #0,d5 * 絶対番地を決定 + move.w d4,d5 +ADRF41: swap d5 + lea WKADF1-WK(a6),a0 + moveq #1,d2 + moveq #0,d3 +ADRF43: tst.b (a0) + bpl ADRF45 + cmp.b 1(a0),d5 + bne ADRF45 + tst.w d3 + bne ADRF44 + st d3 + movea.l 2(a0),a3 +ADRF44: bsr ADRFSB + move.l a3,2(a0) + move.b d2,d0 + bsr SIZCAL + adda.l d0,a3 +ADRF45: lea 10(a0),a0 + rol.b #1,d2 + cmpi.b #WKSNUM,d2 + bls ADRF43 + addq.w #1,d5 + swap d5 + dbra d5,ADRF41 + +ADRF20: moveq #0,d0 + andi.b #$7F,d1 + beq ADRF99 + moveq #0,d5 +ADRF21: suba.l a3,a3 * 仮のアドレスで所要バイト数計算 + lea WKADF1-WK(a6),a0 + moveq #1,d2 +ADRF23: tst.b (a0) + ble ADRF24 + cmp.b 1(a0),d5 + bne ADRF24 + addq.l #1,a3 + bsr ADRFSB + move.b d2,d0 + bsr SIZCAL + adda.l d0,a3 +ADRF24: lea 10(a0),a0 + rol.b #1,d2 + cmpi.b #WKSNUM,d2 + bls ADRF23 + move.l a3,-(sp) * メモリ確保 + DOS _MALLOC + addq.l #4,sp + tst.l d0 + bmi ADRF99 + + move.l d0,a3 * 実際のアドレスを決定 + movea.l a3,a1 + lea WKADF1-WK(a6),a0 + moveq #1,d2 + moveq #0,d3 +ADRF31: tst.b (a0) + ble ADRF34 + cmp.b 1(a0),d5 + bne ADRF34 + tst.w d3 + bne ADRF32 + st d3 + bset #1,(a0) + move.l a3,6(a0) +ADRF32: bsr ADRFSB + move.l d0,2(a0) + move.b d2,d0 + bsr SIZCAL + adda.l d0,a3 +ADRF34: lea 10(a0),a0 + rol.b #1,d2 + cmpi.b #WKSNUM,d2 + bls ADRF31 + move.l a3,a2 * 余分に確保した領域を詰める + suba.l a1,a2 + movem.l a1-a2,-(sp) + DOS _SETBLOCK + addq.l #8,sp + tst.l d0 + bmi ADRF99 + addq.b #1,d5 + dbra d4,ADRF21 + moveq #0,d0 +ADRF99: tst.l d0 + movem.l (sp)+,d1-d5/a0-a3 + rts + +ADRFSB: btst #4,d2 + bne ADRFS1 + moveq #CACHEL-1,d0 + add.l a3,d0 + andi.w #-CACHEL,d0 + movea.l d0,a3 + rts + +ADRFS1: lea $3FF(a3),a3 + move.l a3,d0 + andi.w #$FC00,d0 + movea.l d0,a3 + rts + +TBLREL: .dc.l TBLT16-TBLREL,TBLT08-TBLREL + +SIZCAL: movem.l d1-d5/a0,-(sp) * ワークエリア/テーブルエリアサイズ計算 + move.l d0,d5 + moveq #0,d0 + movem.w VOLMIN-WK(a6),d3-d4 + tst.b d5 + bpl SIZCA1 + lea TBLREL(pc),a0 + adda.l (a0),a0 + bsr SIZCSB + lea TBLREL(pc),a0 + adda.l 4(a0),a0 + bsr SIZCSB +SIZCA1: btst #0,d5 + beq SIZCA2 + move.w PCMBNX-WK(a6),d1 + mulu #(24*4+24*4),d1 +* ↑ ↑DPCM用バッファ +* └PCM用バッファ + add.l d1,d0 +SIZCA2: btst #1,d5 + beq SIZCA3 + move.w PCMBNX-WK(a6),d1 + mulu #(24*3),d1 +* ↑ADPCM用バッファ*3 + add.l d1,d0 +SIZCA3: btst #2,d5 + beq SIZCA4 + move.w PCMCMX-WK(a6),d1 + ext.l d1 + lsl.w #7,d1 + add.l d1,d0 +SIZCA4: btst #3,d5 + beq SIZCA5 + add.l #$10000+(VOLWID+1)*$300,d0 +* ↑ADPCM変換 ↑ADPCM変換 +* テーブル2 テーブル1 +SIZCA5: btst #4,d5 + beq SIZCA6 + sub.b d3,d4 + addi.w #VOLWID+1,d4 + swap d4 + lsr.l #6,d4 + add.l d4,d0 + addi.l #(VOLWID+1)*$400,d0 +SIZCA6: movem.l (sp)+,d1-d5/a0 + rts + +SIZCSB: moveq #0,d1 * 16/8ビットルーチンサイズ計算 + move.w (a0),d1 + beq SIZCS7 * 終わり + move.b d1,d2 + lsr.w #8,d1 + cmp.b d2,d3 * 音量範囲チェック + bhi SIZCS5 + cmp.b d1,d4 + bcs SIZCS5 + move.w 2(a0),d1 * 追加バイト数 + clr.b d1 + add.l d1,d0 + move.w 4(a0),d1 * プログラム長さ + add.l d1,d0 + bra SIZCS6 +SIZCS5: move.w 4(a0),d1 +SIZCS6: adda.l d1,a0 * 次のテーブル + addq.l #6,a0 + bra SIZCSB +SIZCS7: rts + +SUBGEN: movem.l d0-d5/a0-a2,-(sp) * 8/16ビットPCMルーチン作成 + movem.w VOLMIN-WK(a6),d3-d4 + lea TBLREL(pc),a0 * 16ビットPCMルーチン作成 + adda.l (a0),a0 + lea PCMXT2-WK(a6),a1 + lea P16X0,a2 + bsr SUBGSB + lea TBLREL(pc),a0 * 8ビットPCMルーチン作成 + adda.l 4(a0),a0 + lea PCMXT3-WK(a6),a1 + lea P08X0,a2 + bsr SUBGSB + movem.l (sp)+,d0-d5/a0-a2 + rts + +SUBGSB: moveq #VOLMN2,d5 * PCMルーチン作成 +SUBG10: move.w (a0)+,d1 + beq SUBG40 * 終わり + move.b d1,d2 + lsr.w #8,d1 + cmp.b d2,d3 * 音量範囲チェック + bhi SUBG30 + cmp.b d1,d4 + bcs SUBG30 +SUBG20: cmp.b d1,d5 + bcc SUBG21 + move.l a2,(a1)+ * 音量が最小値以下の場合 + addq.b #1,d5 + bra SUBG20 +SUBG21: moveq #2,d0 + add.l a3,d0 +SUBG22: cmp.b d2,d5 + bhi SUBG23 + move.l d0,(a1)+ * 処理アドレスの設定 + addq.b #1,d5 + bra SUBG22 +SUBG23: move.l (a0)+,d1 + dbra d1,SUBG25 + bra SUBG26 +SUBG25: move.b (a0)+,(a3)+ * 処理ルーチンのコピー + dbra d1,SUBG25 +SUBG26: swap d1 + tst.w d1 + beq SUBG10 + bsr TBLISB + bra SUBG10 +SUBG30: move.l (a0)+,d1 + adda.w d1,a0 * 次のテーブル(上位16ビットはフラグのため無視) + bra SUBG10 +SUBG40: cmpi.b #VOLMX2,d5 + bhi SUBGSE + move.l a2,(a1)+ + addq.b #1,d5 + bra SUBG40 +SUBGSE: rts + +TBLISB: movem.l d0-d4,-(sp) * 8ビットPCM音量変換テーブル作成(256バイト) + move.b d1,d3 * D3:シフト量1,D4:シフト量2 + lsr.b #4,d3 + moveq #$F,d4 + and.b d1,d4 + moveq #0,d2 * 入力値初期化 +TBLIS1: move.b d2,d0 + ext.w d0 + asl.w #2,d0 * 精度を稼ぐために下駄を履かせる + asr.w d3,d0 + move.w d0,d1 + asr.w d4,d1 + add.w d1,d0 + asr.w #2,d0 * 下駄を戻す + move.b d0,(a3)+ + addq.b #1,d2 + bcc TBLIS1 + movem.l (sp)+,d0-d4 + rts + +INIT: lea TBLTOP,a3 * 各種初期化 + bsr SUBGEN * 8/16ビットPCMルーチン作成 + +INIT2: pea 0.w + DOS _SUPER + move.l d0,(sp) + + moveq #0,d1 * バッファエリア確保 + movea.l WKADR1-WK(a6),a3 + move.w PCMBNX-WK(a6),d2 + move.l a3,DPCMBF-WK(a6) + move.w d2,d0 + mulu #24*4,d0 + bsr WKINIT + move.l a3,PCMBU1-WK(a6) + move.l a3,PCMBU2-WK(a6) + move.w d2,d0 + mulu #24*4,d0 + bsr WKINIT + + movea.l WKADR2-WK(a6),a3 + move.l a3,ADPBF1-WK(a6) + moveq #PCMSPC,d1 + move.w d2,d0 + mulu #24,d0 + move.w d0,d2 + bsr WKINIT + move.l a3,ADPBF2-WK(a6) + bsr WKINIT + move.l a3,ADPBFX-WK(a6) + moveq #PCMSP2,d1 + moveq #PCMSPN,d0 + sub.w d0,d2 + bsr WKINIT + moveq #PCMSP3,d1 + moveq #PCMSPR,d0 + sub.w d0,d2 + bsr WKINIT + moveq #PCMSPC,d1 + move.w d2,d0 + bsr WKINIT + + movea.l WKADR3-WK(a6),a3 + move.l a3,CHNWK-WK(a6) * チャンネルワーク確保 + move.w PCMCMX-WK(a6),d0 + lsl.w #7,d0 + adda.w d0,a3 + + movea.l WKADR4-WK(a6),a3 + movea.l a3,a0 * DPCM→ADPCM変換テーブル作成 + adda.l #$8000,a0 + move.l a0,TBLAD3-WK(a6) + adda.l #$8000,a0 + move.l a0,TBLAD2-WK(a6) + bsr TBLADP + + movea.l WKADR5-WK(a6),a3 + lea $3FF(a3),a3 * 1024バイト境界にセット + move.l a3,d0 + andi.w #$FC00,d0 + movea.l d0,a3 + lsr.w #2,d0 + move.l d0,TBLAD1-WK(a6) + move.l d0,PCMINI-WK(a6) + + bsr TBLGEN * ADPCM→DPCM変換テーブル作成 + + tst.w (sp) + bmi INITE + DOS _SUPER +INITE: addq.l #4,sp + rts + +WKINIT: move.w d0,-(sp) + bra WKINI2 +WKINI1: move.b d1,(a3)+ +WKINI2: dbra d0,WKINI1 + move.w (sp)+,d0 + rts + +TBLADP: movem.l d0-d7/a0-a2/a4-a6,-(sp) * DPCM→ADPCM変換テーブル作成 + lea DLTTBX(pc),a0 * 65536バイトルックアップテーブル + adda.l #$8000,a3 * 入力 出力 + movea.l a3,a2 * $8000 $FE + movea.l a3,a1 * : : + addq.l #1,a1 * $FFFF $80 + moveq #0,d0 * $0000 $00 + moveq #0,d3 * : : +TBLA11: cmpi.w #$7C,d0 * $7FFF $7E + bcs TBLA12 + addq.l #2,a0 +TBLA12: moveq #0,d4 + move.w (a0)+,d4 + move.w d4,d2 + sub.w d3,d2 + subq.w #1,d2 + bcs TBLA14 + move.w d0,d1 + tas d1 +TBLA13: move.b d1,-(a1) + move.b d0,(a3)+ + dbra d2,TBLA13 + addq.b #2,d0 +TBLA14: move.w d4,d3 + cmpi.b #$7E,d0 + bcs TBLA11 + move.w #$7FFF,d4 + sub.w d3,d4 + move.w d0,d1 + tas d1 +TBLA15: move.b d1,-(a1) + move.b d0,(a3)+ + dbra d4,TBLA15 + move.b d1,-(a1) + + lea DLTTBA(pc),a0 * ADPCM変換テーブル + moveq #0,d7 * 入力 $00~$FE +TBLA20: movea.l a3,a4 * 出力 (1)ADPCMデータ(256バイト) + swap d7 * (2)DPCMデータ(256バイト) + lea DLTTB3(pc),a1 * (3)次のテーブルへのオフセット(256バイト) + clr.w d7 * テーブルは49個(合計768*49=37632バイト) + moveq #0,d6 +TBLA21: movem.w (a1)+,d4-d5 + mulu (a0),d4 + move.w d4,d3 + sub.w (a0),d4 + lsr.w #3,d4 + move.w d3,d2 + lsr.w #4,d2 + add.w d2,d3 + addq.w #4,d3 + lsr.w #3,d3 + cmpi.w #$0700,d7 + bcs TBLA22 + move.w #$80,d2 + bra TBLA23 +TBLA22: moveq #0,d2 + move.b (a2,d3.w),d2 +TBLA23: move.w d2,d3 + sub.w d6,d2 + lsr.w #1,d2 + subq.w #1,d2 + bcs TBLA27 + move.w d7,d0 + ori.w #$0880,d0 + move.w d4,d1 + neg.w d1 + swap d7 + add.w d7,d5 + bpl TBLA24 + move.w d7,d5 +TBLA24: cmpi.w #VOLWID,d5 + bls TBLA25 + move.w #VOLWID,d5 +TBLA25: sub.w d7,d5 + swap d7 + lsl.w #8,d5 + movea.l a4,a5 + adda.w d5,a5 + add.w d5,d5 + adda.w d5,a5 +TBLA26: move.w d7,(a3) + move.w d0,$80(a3) + move.w d4,$100(a3) + move.w d1,$180(a3) + movea.l a5,a6 + suba.l a3,a6 + move.w a6,$200(a3) + lea -$80(a6),a6 + move.w a6,$280(a3) + addq.l #2,a3 + dbra d2,TBLA26 +TBLA27: move.w d3,d6 + addi.w #$0110,d7 + cmpi.w #$80,d6 + bcs TBLA21 + lea $280(a3),a3 + addq.l #2,a0 + swap d7 + addq.w #1,d7 + cmpi.w #VOLWID,d7 + bls TBLA20 + movem.l (sp)+,d0-d7/a0-a2/a4-a6 + rts + +TBLGEN: movem.l d0-d6/a0-a2/a4,-(sp) * ADPCM→DPCM変換テーブル作成 + lea DLTTB2(pc),a1 * (1)倍率変化テーブル作成(256*4*49=50176バイト) + moveq #0,d3 * 現在の倍率を初期化 +TBLG01: move.l a3,d5 * 現在のテーブルの先頭アドレスを保存 + moveq #0,d4 +TBLG02: move.w d4,d0 * 下位4ビットのADPCMデータによる倍率の変化量を求める + andi.w #$F,d0 + add.w d0,d0 + move.w (a1,d0.w),d1 + add.w d3,d1 * 範囲制限(0~VOLWID) + bpl TBLG03 + moveq #0,d1 + bra TBLG04 +TBLG03: cmpi.w #VOLWID,d1 + bls TBLG04 + moveq #VOLWID,d1 +TBLG04: sub.w d3,d1 + move.w d4,d0 * 上位4ビットのADPCMデータによる倍率の変化量を求める + andi.w #$F0,d0 + lsr.w #3,d0 + add.w (a1,d0.w),d1 + add.w d3,d1 * 範囲制限(0~VOLWID) + bpl TBLG05 + moveq #0,d1 + bra TBLG06 +TBLG05: cmpi.w #VOLWID,d1 + bls TBLG06 + moveq #VOLWID,d1 +TBLG06: sub.w d3,d1 + swap d1 * 変化先のアドレスを求める + clr.w d1 + asr.l #6,d1 + add.l d5,d1 + lsr.w #2,d1 + move.b d4,d1 * 下位バイトに現在のADPCMデータを入れる(意味無し) + move.l d1,(a3)+ + addq.b #1,d4 * 次のADPCMデータ + bcc TBLG02 + addq.w #1,d3 * 次の倍率 + cmpi.w #VOLWID,d3 + bls TBLG01 + move.l a3,d5 * (2)DPCMデータ作成,合計256*4*(64+49+32)=148480バイト + lea DLTTBA(pc),a0 * (下位4ビット分) + move.w VOLMIN-WK(a6),d4 * 音量レベル初期化 + subi.w #VOLOFS,d4 + move.w d4,d3 + add.w d3,d3 + adda.w d3,a0 + move.w VOLMAX-WK(a6),d6 + subi.w #VOLOFS-VOLWID,d6 + moveq #0,d3 +TBLG11: move.w (a0)+,d3 + cmpi.w #VOLCLP,d4 * 変化量の上限を制限 + blt TBLG12 + subq.l #2,a0 +TBLG12: move.l d3,d2 * 下位4ビットのデータを作成 + moveq #8-1,d0 +TBLG13: cmpi.l #$3FFFF,d2 + bls TBLG14 + move.l #$3FFFF,d2 +TBLG14: ror.l #3,d2 + move.w d2,d1 + neg.w d1 + move.w d2,(a3) + move.w d1,$20(a3) + move.w d2,$40(a3) + move.w d1,$60(a3) + move.w d2,$80(a3) + move.w d1,$A0(a3) + move.w d2,$C0(a3) + move.w d1,$E0(a3) + move.w d2,$100(a3) + move.w d1,$120(a3) + move.w d2,$140(a3) + move.w d1,$160(a3) + move.w d2,$180(a3) + move.w d1,$1A0(a3) + move.w d2,$1C0(a3) + move.w d1,$1E0(a3) + move.w d2,$200(a3) + move.w d1,$220(a3) + move.w d2,$240(a3) + move.w d1,$260(a3) + move.w d2,$280(a3) + move.w d1,$2A0(a3) + move.w d2,$2C0(a3) + move.w d1,$2E0(a3) + move.w d2,$300(a3) + move.w d1,$320(a3) + move.w d2,$340(a3) + move.w d1,$360(a3) + move.w d2,$380(a3) + move.w d1,$3A0(a3) + move.w d2,$3C0(a3) + move.w d1,$3E0(a3) + addq.l #4,a3 + rol.l #3,d2 + add.l d3,d2 + add.l d3,d2 + dbra d0,TBLG13 + lea $3E0(a3),a3 + addq.w #1,d4 + cmp.w d6,d4 + ble TBLG11 + movea.l d5,a3 * (3)DPCMデータ作成2(上位4ビット分) + movea.l d5,a0 * テーブルの先頭アドレスに戻す + movea.l a0,a2 + moveq #VOLWID,d3 + add.w VOLMAX-WK(a6),d3 + sub.w VOLMIN-WK(a6),d3 + swap d3 + lsr.l #6,d3 + adda.l d3,a2 + addq.l #2,a3 + move.w VOLMIN-WK(a6),d4 + subi.w #VOLOFS,d4 +TBLG31: moveq #0,d3 +TBLG32: move.b d3,d0 * 下位4ビットによるデータを求める + andi.w #$F,d0 + add.w d0,d0 + move.w (a1,d0.w),d0 + move.w VOLMIN-WK(a6),d2 + subi.w #VOLOFS,d2 + add.w d0,d2 + lsl.w #8,d0 + sub.w d3,d0 + ext.l d0 + lsl.l #2,d0 + moveq #0,d5 * 上位4ビットによるオフセットを求める + move.b d3,d5 + andi.w #$F0,d5 + lsr.w #2,d5 + add.l d5,d0 + moveq #VOLWID,d1 + add.w VOLMAX-WK(a6),d1 + sub.w VOLMIN-WK(a6),d1 + movea.l a3,a4 +TBLG33: cmp.w d4,d2 * 範囲制限(VOLMIN~VOLLIM) + blt TBLG34 + cmp.w d6,d2 + bgt TBLG35 + move.w -2(a4,d0.l),(a4) * データ設定(変化先の値を複写する) + lea $400(a4),a4 + addq.w #1,d2 + dbra d1,TBLG33 + bra TBLG36 +TBLG34: move.w (a0,d5.l),(a4) * 下方向のクリップ(最下位のテーブルを参照) + lea $400(a4),a4 + addq.w #1,d2 + dbra d1,TBLG33 + bra TBLG36 +TBLG35: move.w (a2,d5.l),(a4) * 上方向のクリップ(最上位のテーブルを参照) + lea $400(a4),a4 + addq.w #1,d2 + dbra d1,TBLG33 +TBLG36: addq.l #4,a3 + addq.b #1,d3 + bcc TBLG32 + lea $400(a2),a3 + movem.l (sp)+,d0-d6/a0-a2/a4 + rts + +HEXCNV: movem.l d0-d2/a0,-(sp) * 16進文字列変換,D0.W→(A0)~2バイト + moveq #2-1,d2 + tst.w d0 + bmi HEXCN4 +HEXCN1: rol.b #4,d0 + moveq #$F,d1 + and.b d0,d1 + addi.b #'0',d1 + cmpi.b #'9',d1 + bls HEXCN2 + addi.b #'A'-'9'-1,d1 +HEXCN2: move.b d1,(a0)+ + dbra d2,HEXCN1 +HEXCN3: movem.l (sp)+,d0-d2/a0 + rts + +HEXCN4: move.b #'?',(a0)+ + dbra d2,HEXCN4 + bra HEXCN3 + +DECCNV: movem.l d0-d4/a0-a1,-(sp) * 10進文字列変換,D0.W→(A0)~3バイト + tst.w d0 + bmi DECCN8 + lea DECTBL(pc),a1 + andi.w #$FF,d0 + moveq #0,d4 + bra DECCN5 +DECCN1: move.w (a1)+,d1 + moveq #0,d3 +DECCN2: add.b d3,d3 + cmp.w d1,d0 + bcs DECCN3 + sub.w d1,d0 + addq.b #1,d3 +DECCN3: lsr.w #1,d1 + dbra d2,DECCN2 + or.b d3,d4 + bne DECCN4 + moveq #' '-'0',d3 * 頭の0は空白にする +DECCN4: addi.b #'0',d3 + move.b d3,(a0)+ +DECCN5: move.w (a1)+,d2 + bpl DECCN1 +DECCN6: addi.b #'0',d0 + move.b d0,(a0) +DECCN7: movem.l (sp)+,d0-d4/a0-a1 + rts + +DECCN8: moveq #3-1,d0 +DECCN9: move.b #'?',(a0)+ + dbra d0,DECCN9 + bra DECCN7 + + .data + +* ↓これらの値は 32768/1.1^(80-n) の解の小数点未満を切り捨てたもの +* (ちなみに PCM8.X のテーブルは7捨8入した値になっている) +DLTTB1: .dc.w 0, 0, 0, 0, 0, 0, 0, 0 * -64...-57 + .dc.w 0, 0, 0, 0, 0, 0, 0, 0 * -56...-49 + .dc.w 0, 0, 0, 0, 0, 0, 0, 0 * -48...-41 + .dc.w 0, 0, 0, 0, 0, 0, 0, 0 * -40...-33 + .dc.w 0, 0, 0, 1, 1, 1, 1, 1 * -32...-25 + .dc.w 1, 1, 1, 2, 2, 2, 2, 3 * -24...-17 + .dc.w 3, 3 * -16...-15 +DLTTBX: .dc.w 4, 4, 5, 5, 6, 6 * -14... -9 + .dc.w 7, 8, 9, 9, 10, 12, 13, 14 * -8... -1 +DLTTBA: .dc.w 15, 17, 19, 21, 23, 25, 28, 31 * 0... 7 + .dc.w 34, 37, 41, 45, 50, 55, 60, 66 * 8... 15 + .dc.w 73, 80, 88, 97, 107, 118, 130, 143 * 16... 23 + .dc.w 157, 173, 190, 209, 230, 253, 279, 307 * 24... 31 + .dc.w 337, 371, 408, 449, 494, 543, 598, 658 * 32... 39 + .dc.w 724, 796, 876, 963,1060,1166,1282,1410 * 40... 47 + .dc.w 1551,1707,1877,2065,2272,2499,2749,3024 * 48... 55 + .dc.w 3326,3659,4025,4427,4870,5357,5893,6482 * 56... 63 + .dc.w 7131,7844,8628,9491,10440,11484,12633,13896 * 64... 71 + .dc.w 15286,16815,18496,20346,22380,24619,27080,29789 * 72... 79 + +DLTTB2: .dc.w -1,-1,-1,-1, 2, 4, 6, 8 + .dc.w -1,-1,-1,-1, 2, 4, 6, 8 + +DLTTB3: .dc.w 2,-1 + .dc.w 4,-1 + .dc.w 6,-1 + .dc.w 8,-1 + .dc.w 10, 2 + .dc.w 12, 4 + .dc.w 14, 6 + .dc.w 16, 8 + +DECTBL: .dc.w 1,200 + .dc.w 3,80 + .dc.w -1 + +TTLME1: .dc.b 13,10 +TTLMES: .dc.b 'X68k PCM8A polyphonic ADPCM driver v1.02 ' *;version + .dc.b '(c)1993-97 philly',13,10,0 +USEMES: .dc.b '使用法:PCM8A [<スイッチ>]',13,10 + .dc.b '<スイッチ>',9,'ON',9,': 多重再生モード(通常)',13,10 + .dc.b 9,'OFF',9,': 単音再生モード',13,10 + .dc.b 9,'FNC',9,': IOCSのみ単音再生モード',13,10 + .dc.b 9,'CLR',9,': 全チャンネルを初期化',13,10 + .dc.b 9,'-R',9,': 常駐解除',13,10 + .dc.b 9,'-D[n]',9,': 動作表示 ON/OFF (通常:0)',13,10 + .dc.b 9,9,' n = 0:OFF , 1:ON , 省略:ON/OFFの反転',13,10 + .dc.b 9,'-V[n]',9,': 音量変換 ON/OFF (通常:1)',13,10 + .dc.b 9,9,' n = 0:OFF , 1:ON , 省略:ON/OFFの反転',13,10 + .dc.b 9,'-In',9,': IOCSで使用するチャンネル数 (通常:8)',13,10 + .dc.b 9,9,' n = 0~9 (0:IOCS出力を禁止)',13,10 + .dc.b 9,'-S[n1],[n2],[n3],[n4] : システム状態の設定',13,10 + .dc.b 9,9,' n1= チャンネル数 (1~32,通常:25)',13,10 + .dc.b 9,9,' n2= 処理バイト数/12 (1~12,通常:4)',13,10 + .dc.b 9,9,' n3= 最小音量 (0~15,$40~$A0,通常:$40)',13,10 + .dc.b 9,9,' n4= 最大音量 (0~15,$40~$A0,通常:$A0)',13,10 + .dc.b 9,'-Wn',9,': バッファ/テーブルの分離 (常駐時のみ有効)',13,10 + .dc.b 9,9,' n = 1~31 (ビット0~4で分離する領域を指定)',13,10 + .dc.b 9,'-M[n]',9,': ADPCM動作モード (通常:0)',13,10 + .dc.b 9,9,' n = 0:4M/8M , 1:16M/8M , 2~4:4M/8M/16M (Hz)',13,10 + .dc.b 9,9,' A:自動判定 , 省略:環境変数(OPM_CT1)参照',13,10 + .dc.b 9,9,9,'(1~4はADPCMをクロックアップ改造してある場合に有効)',13,10 + .dc.b 9,'-F[n]',9,': ADPCM動作周波数 (通常:0)',13,10 + .dc.b 9,9,' n = 0:15.6k , 1:20.8k , 2:31.2k',13,10 + .dc.b 9,9,' 4: 3.9k , 5: 5.2k , 6: 7.8k , 7:10.4k (Hz)',13,10 + .dc.b 9,9,' 省略:最高周波数(-Mスイッチの指定に依存する)',13,10 + .dc.b 9,9,9,'(1,2はADPCMをクロックアップ改造してある場合に有効)',13,10 + .dc.b 9,'〈常駐状態での設定変更が可能です〉',13,10 + .dc.b 0 + +KERMES: .dc.b '《常駐を拒否されました》',13,10,0 +KEMMES: .dc.b '《メモリが足りないので常駐できません》',13,10,0 +KRDMES: .dc.b '《既に常駐しています》',13,10,0 +REXMES: .dc.b '《常駐していません》',13,10,0 +RELMES: .dc.b '《常駐を解除しました》',13,10,0 +RERMES: .dc.b '《ベクタが変更されているので常駐を解除できません》',13,10,0 +RENMES: .dc.b '《解除が禁止されています》',13,10,0 +DIEMES: .dc.b '《組み込みを拒否されました》',13,10,0 +DRDMES: .dc.b '《既に組み込まれています》',13,10,0 +DOTMES: .dc.b '《解除しました》',13,10,0 +DOEMES: .dc.b '《ベクタが変更されているので解除できません》',13,10,0 +DERMES: .dc.b '《組み込みができません》',13,10,0 +SWEMES: .dc.b '《スイッチの指定に誤りがあります》',13,10,0 +CNGMES: .dc.b '《設定を変更しました》',13,10,0 +CLRMES: .dc.b '《内部を初期化しました》',13,10,0 +OTHMES: .dc.b '《他のADPCMドライバが常駐しています》',13,10 +DMYMES: .dc.b 0 + +STAMES: .dc.b '多重再生モード :' +STAM01: .dc.b 'OFF',13,10 + .dc.b '動作表示モード :' +STAM02: .dc.b 'OFF',13,10 + .dc.b '音量変換モード :' +STAM03: .dc.b 'OFF',13,10 + .dc.b 'IOCSチャンネル数:' +STAN01: .dc.b '000',13,10 + .dc.b '有効チャンネル数:' +STAN02: .dc.b '000',13,10 + .dc.b '処理バイト数 :' +STAN03: .dc.b '000',13,10 + .dc.b '最小音量値 :$' +STAH01: .dc.b '00',13,10 + .dc.b '最大音量値 :$' +STAH02: .dc.b '00',13,10 + .dc.b 'ADPCM動作モード :' +STAN10: .dc.b '000',13,10 + .dc.b 'ADPCM動作周波数 :' +STAM10: .dc.b '15.6kHz',13,10 + .dc.b '常駐モード :' +STAM11: .dc.b 'コマンドライン ',13,10 + .dc.b 'PCM8占有 :' +STAM04: .dc.b 'OFF',13,10 + .dc.b 'MPCM占有 :' +STAM05: .dc.b 'OFF',13,10,0 +MPCMES: .dc.b '占有しているアプリケーション' +CRLF: .dc.b 13,10,0 + +STAMB0: .dc.b 'OFF',0 + .dc.b 'ON ',0 + .dc.b 'FNC',0 + .dc.b '???',0,0 +STAMF0: .dc.b ' 3.9',0 + .dc.b ' 5.2',0 + .dc.b ' 7.8',0 + .dc.b '10.4',0 + .dc.b '15.6',0 + .dc.b '20.8',0 + .dc.b '31.2',0 + .dc.b '????',0,0 +STAMJ0: .dc.b 'コマンドライン ',0 + .dc.b 'デバイスドライバ',0,0 + +DEVNUL: .dc.b 'NUL ' * デバイス名 +DEVNA1: .dc.b 'PCM ' +DEVNA2: .dc.b '@PCM ' + +ADPMOD: .dc.b 'OPM_CT1',0 + + .bss + +WKBUF: .ds.b WKSIZ +WKBUFE: .ds.b 10 + + .even +LASTAD: + + .end START + \ No newline at end of file diff --git a/src/pcm8atec.doc b/src/pcm8atec.doc new file mode 100644 index 0000000..2acce1e --- /dev/null +++ b/src/pcm8atec.doc @@ -0,0 +1,1480 @@ +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ ┃ +┃ リアルタイム ADPCM多重再生ドライバー 『PCM8A』 ┃ +┃ ┃ +┃ version 1.02 テクニカルマニュアル ┃ +┃ philly 1993-1997 ┃ +┃ ┃ +┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +1.PCMデータ形式 + + PCM8Aが取り扱える PCM データの形式は、以下の3種類です。 + + (1)ADPCM + +  X680x0 で標準的に使われているPCMデータです。 + + (2)16ビットPCM + +  C言語の signed short に相当します。 +  この形式のデータは、常に偶数番地から始まり、データの長さ + も偶数バイトが指定されていなくてはなりません。 + + (3)8ビットPCM + +  C言語の signed char に相当します。 +  出力時は、8ビットのデータの符号を拡張して16ビットとし、 + 合成を行います。 + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +2.PCM8Aコール方法 + + 以下の3種類の方法をサポートしています。 + + (1)trap #1 命令を使用したファンクションコール(MPCM.X 相当) + + (2)trap #2 命令を使用したファンクションコール + + (3)IOCS コールによる簡易使用 + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +3.MPCMファンクション一覧 + +  trap #1 命令による MPCM.X 相当の機能のコールは、それに対応する + trap #2 コールの説明の中で行っています。 + +  trap #1 と trap #2 の機能コードの対応は以下の通りです。 + + trap #1 trap #2 + $0000~$13FF → $2000~$33FF + $8000~$8006 → $A000~$A006 + +  また、MPCM 用のコールと PCM8A 用のコールでのチャンネル番号の対応 + は以下の通りとなります。 + + MPCM PCM8A + 演奏出力用:0~15 → 0~15 + 効果音用 :0~ 7 → 16~23 + IOCS用 → 24 + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +4.PCM8Aファンクション一覧 + +  trap #2 命令を使用したファンクションコールの詳細を示します。 + +  D0.W に機能コードを設定し、他のレジスタに適切な値を設定した後、 + trap #2 命令を実行してください。 + +  戻り値は D0.L に設定され、他のデータ/アドレスレジスタは全て保存 + されます。 + +  以下の内容は、PCM8A version 1.01 の時点のものです。 + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 1:通常出力 機能コード $000x , $10xx +───────────────────────────────────── + +機能: 単一メモリ領域のデータを出力する + +呼出: D0.W $0000 + チャンネル番号 (0~15) + $1000 + チャンネル番号 (0~最大チャンネル番号) + + D1.L 音量/周波数/定位の指定 + + ビット + 23~16 :音量指定( $FF , $00~$0F , $40~$A0 ) +  $FF   :前の値を保持 +  $00~$0F :原音量は $08 +    ( -16dB~+14dB ,1ステップ≒ 2dB) +  $40~$A0 :原音量は $80 +    ( -53dB~+26dB ,1ステップ≒0.8dB) +  ※詳細は『8.音量変換の詳細について』を参照 +   単音再生モードでは常に原音量で出力する + + 15~ 8 :周波数及びデータ形式の指定 +  $FF   :前の値を保持 +   設定値一覧 +   ┌────┬────┬────┬────┐ +   │ 周波数 │ ADPCM │16bitPCM│ 8bitPCM│ +   ├────┼────┼────┼────┤ +   │ 3.9 kHz│ $00,$30│ $10 │ $20 │ +   ├────┼────┼────┼────┤ +   │ 5.2 kHz│ $01,$31│ $11 │ $21 │ +   ├────┼────┼────┼────┤ +   │ 7.8 kHz│ $02,$32│ $12 │ $22 │ +   ├────┼────┼────┼────┤ +   │10.4 kHz│ $03,$33│ $13 │ $23 │ +   ├────┼────┼────┼────┤ +   │15.6 kHz│ $04,$34│ $05,$14│ $06,$24│ +   ├────┼────┼────┼────┤ +   │20.8 kHz│ $07,$35│ $08,$15│ $09,$25│ +   ├────┼────┼────┼────┤ +   │31.2 kHz│ $0A,$36│ $0B,$16│ $0C,$26│ +   └────┴────┴────┴────┘ +  ※単音再生モードでは 20.8kHz/31.2kHz ADPCM形式や +   16bit/8bit PCM形式は指定できない + + 7~ 0 :定位指定( $FF , $00~$03 ) +  $FF   :前の値を保持 +  $00   :再生停止 +    (音量/周波数は変更されるが、定位は + 変更されない) +  $01   :左出力 +  $02   :右出力 +  $03   :左右(中央)出力 +  ※この指定は全チャンネルに共通であり、最後に指定 +   された $00 以外の値が有効になる + + 他のビットは無効 + + D2.L 出力するデータのバイト数 + < 0  :データ長問い合わせ(機能コード $008x と同機能) + = 0  :チャンネル動作停止 +  (音量/周波数/定位は変更されない) + ※16ビットPCM出力時には偶数を指定すること + + A1.L データ先頭アドレス + ※16ビットPCM出力時には偶数アドレスを指定すること + +戻値: D0.L ( D2.L < 0 の場合、機能コード $008x を参照のこと) + = 0 :正常終了 + = -1 :出力不可能 + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 2:アレイチェーン出力 機能コード $001x , $11xx +───────────────────────────────────── + +機能: アレイチェーンテーブルによって、間接的に指定された複数のメモリ領域 + のデータを出力する + +呼出: D0.W $0010 + チャンネル番号 (0~15) + $1100 + チャンネル番号 (0~最大チャンネル番号) + + D1.L 音量/周波数/定位の指定 + 通常出力($000x)の指定に同じ + + D2.L アレイチェーンデータの個数 + < 0  :データ長問い合わせ(機能コード $008x と同機能) + = 0  :チャンネル動作停止 +  (音量/周波数/定位は変更されない) + ※設定できる値は、最大 65535($FFFF) まで + + A1.L アレイチェーンテーブル先頭アドレス + (アレイチェーンテーブルについての説明は省略) + ※必ず偶数アドレスを指定すること + +戻値: D0.L ( D2.L < 0 の場合、機能コード $008x を参照のこと) + = 0 :正常終了 + = -1 :出力不可能 + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 3:リンクアレイチェーン出力 機能コード $002x , $12xx +───────────────────────────────────── + +機能: リンクアレイチェーンテーブルによって、間接的に指定された複数のメモ + リ領域のデータを出力する + +呼出: D0.W $0020 + チャンネル番号 (0~15) + $1200 + チャンネル番号 (0~最大チャンネル番号) + + D1.L 音量/周波数/定位の指定 + 通常出力($000x)の指定に同じ + + A1.L リンクアレイチェーンテーブル先頭アドレス + (リンクアレイチェーンテーブルについての説明は省略) + ※必ず偶数アドレスを指定すること + +戻値: D0.L = 0 :正常終了 + = -1 :出力不可能 + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 4:動作モード変更 機能コード $007x , $17xx +───────────────────────────────────── + +機能: 動作中のチャンネルの音量/周波数/定位を変更する + +呼出: D0.W $0070 + チャンネル番号 (0~15) + $1700 + チャンネル番号 (0~最大チャンネル番号) + + D1.L 音量/周波数/定位の指定 + 通常出力($000x)の指定に同じ + +戻値: D0.L = 0 :正常終了 + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 5:データ長問い合わせ 機能コード $008x , $18xx +───────────────────────────────────── + +機能: 動作中のチャンネルの残りデータ長を取得する + +呼出: D0.W $0080 + チャンネル番号 (0~15) + $1800 + チャンネル番号 (0~最大チャンネル番号) + +戻値: D0.L = 0 :チャンネルは停止中 + > 0 :残りのデータのバイト数 +  (多重再生モードで、通常出力中) + = -1 :アレイチェーン出力中 + = -2 :リンクアレイチェーン出力中 + = -3 :単音再生モードで出力中 + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 6:動作モード問い合わせ 機能コード $009x , $19xx +───────────────────────────────────── + +機能: 動作中のチャンネルの音量/周波数/定位を取得する + +呼出: D0.W $0090 + チャンネル番号 (0~15) + $1900 + チャンネル番号 (0~最大チャンネル番号) + +戻値: D0.L > 0 :音量/周波数/定位 +  通常出力($000x)を参照のこと +  ※定位は常に $01~$03 の値となり、ビット 31~24 +   は常に 0 となる + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 7:アクセスアドレス問い合わせ 機能コード $00Ax , $1Axx +───────────────────────────────────── + +機能: 動作中のチャンネルのアドレスポインタの情報を取得する + +呼出: D0.W $00A0 + チャンネル番号 (0~15) + $1A00 + チャンネル番号 (0~最大チャンネル番号) + +戻値: D0.L ≧ 0 :ADPCM/PCMデータのアドレスポインタ情報 + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 8:チャンネル一時停止 機能コード $00Bx , $1Bxx +───────────────────────────────────── + +機能: チャンネルの動作を一時停止する +  この処理は $000x , $001x のコールで、 D2.L = 0 を指定した場合と + 同じになる + +呼出: D0.W $00B0 + チャンネル番号 (0~15) + $1B00 + チャンネル番号 (0~最大チャンネル番号) + +戻値: D0.L = 0 :正常終了 + +  一時停止($0101)とは別に扱われ、どちらかのコールで一時停止が指 + 定されれば、チャンネルの動作は一時停止状態に入る + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 9:チャンネル一時停止解除 機能コード $00Cx , $1Cxx +───────────────────────────────────── + +機能: チャンネルの一時停止状態を解除する + +呼出: D0.W $00C0 + チャンネル番号 (0~15) + $1C00 + チャンネル番号 (0~最大チャンネル番号) + +戻値: D0.L = 0 :正常終了 + = -1 :一時停止解除不可能 + +  一時停止解除($0102)とは別に扱われ、両方のコールで一時停止が解 + 除された場合のみ、チャンネルの一時停止状態は解除される +  過負荷状態になり、一時停止状態になった出力を、このコールで継続出 + 力させることができる +  動作が打ち切られた後の継続出力も可能だが、PCM8Aが初期化され + た後は無効 + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +10:終了 機能コード $0100 +───────────────────────────────────── + +機能: 全チャンネルのチェイン動作を解除し、現在出力中のデータブロックの出 + 力が完了次第、チャンネルの動作を停止する +  一時停止中の場合は即座に全チャンネルの動作を打ち切る + +呼出: D0.W $0100 + +戻値: D0.L = 0 :正常終了 + +  即時終了ではない点に注意すること +  即時に完全に終了させたい場合は、一時停止($0101)の後、本コール + を実行する必要がある +  単音出力中でも、一時停止($0101)実行後に本コールを実行すること + により、即時終了させることができる + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +11:一時停止 機能コード $0101 +───────────────────────────────────── + +機能: 全チャンネルの出力を即座に停止し、一時停止状態に入る +  一時停止状態でチャンネル出力または終了を行うと、全チャンネルの動 + 作が打ち切られる + +呼出: D0.W $0101 + +戻値: D0.L = 0 :正常終了 + +  単音出力中は一時停止しないが、終了($0100)と組み合わせることで、 + 即時終了させることができる + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +12:一時停止解除 機能コード $0102 +───────────────────────────────────── + +機能: 一時停止状態を解除する +  動作が打ち切られた後は無効 + +呼出: D0.W $0102 + +戻値: D0.L = 0 :正常終了 + = -1 :一時停止解除不可能 + +  単音出力中は、このコールは無視される + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +13:PCM8A停止 機能コード $0103 +───────────────────────────────────── + +機能: PCM8AによるADPCMの管理を停止する + +呼出: D0.W $0103 + +戻値: D0.L = 0 :正常終了 + +  この命令が実行されると、ADPCM及びPCM8Aは初期化され、待 + 機状態に入る +  この命令の実行で、ノイズが出力されることがある +  待機状態で出力を行うと、ADPCMはPCM8Aによって管理される + 状態に戻る + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +14:PCM8A動作 機能コード $0104 +───────────────────────────────────── + +機能: ADPCMの管理をPCM8Aに渡す + +呼出: D0.W $0104 + +戻値: D0.L = 0 :正常終了 + +  この命令が実行されると、ADPCM及びPCM8Aは初期化され、動 + 作状態に入る +  この命令の実行で、ノイズが出力されることがある + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +15:PCM8Aシステム情報設定 機能コード $01F8 +───────────────────────────────────── + +機能: PCM8Aシステム情報の取得/設定 + +呼出: D0.W $01F8 + + D1.L = -1 :システム情報取得 + ≠ -1 :システム情報設定 + + ビット + 31~24 :チャンネル数( $FF , $01~$FA ) +  $FF   :前の値を保持 +  $01~$FA :最大チャンネル数 +  ※デフォルトは $08 + + 23~16 :割り込み1回の処理バイト数/12 +  ( $FF , $01~$0C ) +  $FF   :前の値を保持 +  $01~$0C :処理単位 +  ※デフォルトは $04(48バイト単位) +   15.6kHz のADPCMを使用したモードが基準 +   となっている + + 15~ 8 :音量最大値 +  ( $FF , $08~$0F , $80~$A0 ) +  $FF :前の値を保持 +  $00~$0F , $40~$A0 :音量最大値 +  ※デフォルトは $A0 + + 7~ 0 :音量最小値 +  ( $FF , $00~$08 , $40~$80 ) +  $FF :前の値を保持 +  $00~$0F , $40~$A0 :音量最小値 +  ※デフォルトは $40 + +戻値: D0.L (変更前の)システム情報 + + ビット + 31~24 :チャンネル数 +  $01~$FA :全チャンネル数 + + 23~16 :割り込み1回の処理バイト数/12 +  $01~$0C :処理単位 + + 15~ 8 :音量最大値 +  $00~$0F , $40~$A0 :音量最大値 + + 7~ 0 :音量最小値 +  $00~$0F , $40~$A0 :音量最小値 + +  この命令を割り込み処理中に使用し、割り込み1回の処理バイト数を切 + り替えることで、PCM8Aの割り込みタイミングをある程度制御するこ + とができます。 +  ただし、設定を行ってから実際に割り込み間隔が変化するのは、PCM + 8Aの割り込み処理が3回実行された後になります。 + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +16:PCM8Aシステム情報問い合わせ 機能コード $01F9 +───────────────────────────────────── + +機能: PCM8Aシステム情報の取得 + +呼出: D0.W $01F9 + +戻値: D0.L システム情報 + + ビット + 31~16 :割り込み1回の処理バイト数 +  $000C~$0090 :処理バイト数 +  ※PCM8Aシステム情報設定( $01F8 )の +   ビット23~16 を 12倍した値を返す + + 15~ 8 :音量設定最大値 +  $40~$A0 :音量最大値 +  ※$00~$0F の値は $6B~$91 に変換される + + 7~ 0 :音量設定最小値 +  $40~$A0 :音量最小値 +  ※$00~$0F の値は $6B~$91 に変換される + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +17:動作モード問い合わせ/変更 機能コード $01FA +───────────────────────────────────── + +機能: 動作モード情報の取得/設定 + +呼出: D0.W $01FA + + D1.L < 0 :動作モード取得 + ≧ 0  :動作モード設定 + + ビット + 27 :動作表示モード反転 + 26 :音量可変モード反転 + 23~16 :IOCSで使用できるチャンネル数 +  ( $FF , $FE , $00~$FA ) +   $FF    :前の値を保持 +   $FE    :全チャンネルを使用 + (デフォルト) +   $00    :IOCS出力禁止 +   $01~$FA :IOCS出力チャンネル数 + ※ビット 27,26 はモード反転時に 1 を設定する +  ビット 31~28 は 0 を設定しておくこと +  他のビットは無効 + +戻値: D0.L ≧ 0 :(変更前の)動作モード情報 + + ビット + 27 :動作表示モード +   0 :動作表示無し +   1 :動作表示有り + + 26 :音量可変モード(trap #2 による設定状態) + 25 : 〃 + (コマンドラインによる設定状態) +   0 :音量固定 +   1 :音量可変 +  ※音量可変モードの設定はコマンドラインの +   指定とは別に扱われ、両方で音量可変を指 +   定した場合に限り、音量は可変となる + + 24 :組み込みモード +   0 :コマンドラインからの組み込み +   1 :デバイスドライバ組み込み + + 23~16 :IOCSで使用できるチャンネル数 +   $00 :IOCS出力禁止 +   $00以外 :IOCS同時出力チャンネル数 + + 15~ 8 :全チャンネル数 + 7~ 0 :動作中チャンネル数 +  ※単音出力モードでは常に $00 となる + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +18:MPU・MFPマスク設定 機能コード $01FB +───────────────────────────────────── + +機能: PCM8A割込中のMPU/MFP割込マスクを設定する + +呼出: D0.W $01FB + + D1.L 割り込みレベル/マスクデータ指定 + < 0 割り込みレベル/マスク情報取得 + ≧ 0 割り込みレベル/マスク情報設定 + ビット + 18~16 :MPU割り込みレベル(3~7) + 15~ 8 :MFP割り込みマスクA(IMRA) + 7~ 0 :MFP割り込みマスクB(IMRB) + ※ビット15~0の意味は、0 で割り込みマスク、1 で割 +  り込み開始前と同じ状態、の意味になる + +戻値: D0.L ≧ 0 :(変更前の)割り込みレベル/マスク値 +  ※ビット 31~19 は 0 となる + +  割り込み処理についてよく理解してから使用すること +  既定値は %xxxxxxxx_xxxxx011_11011111_00000000( x:無効ビット ) + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +19:多重/単音モードの設定 機能コード $01FC +───────────────────────────────────── + +機能: 多重再生を許可/禁止する + +呼出: D0.W $01FC + + D1.W = -1 :取得のみ + = 0 :多重再生禁止(単音モード) + = 1 :多重再生許可 + = 2 :ファンクションコールのみ多重再生許可 + +戻値: D0.L = 0 :多重再生禁止中 + = 1 :多重再生許可中 + = 2 :ファンクションコールのみ多重再生許可中 + ※変更前の設定状態が戻値となる + +  多重再生禁止中は、IOCS出力及びファンクションによる出力は後か + ら行われたものが有効となる +  多重再生許可状態( 1 または 2 )から多重再生禁止状態( 0 )、ま + たはその逆へ切り替えた場合、全チャンネルを初期化する + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +20:(reserved) 機能コード $01FD +───────────────────────────────────── + + 本コールは予約されています + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +21:占有 機能コード $01FE +───────────────────────────────────── + +機能: PCM8Aを占有し、常駐解除を禁止する + +呼出: D0.W $01FE + +戻値: D0.L = 0 :占有した + = -1 :既に占有されている + +  一般のプログラムでは使ってはならない + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +22:占有解除 機能コード $01FF +───────────────────────────────────── + +機能: PCM8Aの占有を解除し、常駐解除を可能にする + +呼出: D0.W $01FF + +戻値: D0.L = 0 :占有解除した + = -1 :占有されていない + +  一般のプログラムでは使ってはならない + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +23:MPCM KEY ON 機能コード $20xx + trap #1 機能コード $00xx +───────────────────────────────────── + +機能: MPCMモードのチャンネルをキーオンする + +呼出: D0.W $2000 + チャンネル番号 (0~15,255) + +戻値: D0.L = 0 :正常終了 + +  チャンネル番号に 255 を指定すると、全チャンネル(0~15)をキーオン + する +  MPCMデータ登録($22xx)後に実行する事で、PCM出力を開始する + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +24:MPCM KEY OFF 機能コード $21xx + trap #1 機能コード $01xx +───────────────────────────────────── + +機能: MPCMモードのチャンネルをキーオフする + +呼出: D0.W $2100 + チャンネル番号 (0~15,255) + +戻値: D0.L = 0 :正常終了 + +  チャンネル番号に 255 を指定すると、全チャンネル(0~15)をキーオフ + する + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +25:MPCM データ登録 機能コード $22xx + trap #1 機能コード $02xx +───────────────────────────────────── + +機能: チャンネルにPCMデータを登録する + データが登録されたチャンネルはMPCMモードになる + +呼出: D0.W $2200 + チャンネル番号 (0~15,255) + + D1.L 0 :(予約) + + A1.L PCM情報テーブルアドレス + A1.Lからの相対アドレス + +$0000~1バイト :PCM種類 + $FF :ADPCM + 0 :データ無し + 1 :16bitPCM + 2 :8bitPCM + +$0001~1バイト :PCMのオリジナルノート番号 + 0~127 :ノート番号 + 128~255 :原音程に固定 + +$0002~$0003 :0 (予約) + +$0004~4バイト :PCMデータの先頭アドレス + +$0008~4バイト :PCMデータの長さ + +$000C~4バイト :PCMデータのループ開始点 +  (先頭アドレスからのオフセット) + +$0010~4バイト :PCMデータのループ終了点 +  (先頭アドレスからのオフセット) + +$0014~4バイト :ループ回数 (0で無限ループ) + +戻値: D0.L = 0 :正常終了 + < 0 :登録に失敗した + +  データの登録のみを行い、出力は行わない +  チャンネル番号に 255 を指定すると、全チャンネル(0~15)に同一デー + タを登録する +  16bitPCMでは、PCMデータの先頭アドレス/PCMデータの長さ/P + CMデータのループ開始点/PCMデータのループ終了点は全て偶数が指 + 定されていなければならない +  PCMのオリジナルノート番号は、そのPCMの原音程をノート番号 + (0~127)のどこに割り当てるかを指定する + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +26:MPCM 再生周波数指定 機能コード $23xx + trap #1 機能コード $03xx +───────────────────────────────────── + +機能: MPCMモードのチャンネルの基準周波数を設定する + +呼出: D0.W $2300 + チャンネル番号 (0~15,255) + + D1.B 再生周波数 + 0 : 3.9kHz + 1 : 5.2kHz + 2 : 7.8kHz + 3 :10.4kHz + 4 :15.6kHz + 5 :20.8kHz + 6 :31.2kHz + +戻値: D0.L ≧ 0 :正常終了 + < 0 :異常終了 + +  チャンネル番号に 255 を指定すると、全チャンネル(0~15)に同一の設 + 定を行う + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +27:MPCM 音程設定 機能コード $24xx + trap #1 機能コード $04xx +───────────────────────────────────── + +機能: MPCMモードのチャンネルの再生音程を設定する + +呼出: D0.W $2400 + チャンネル番号 (0~15,255) + + D1.W 音程 = ノート番号(0~127) × 64 + ディチューン(0~63) + +戻値: D0.L ≧ 0 :正常終了 + < 0 :異常終了 + +  チャンネル番号に 255 を指定すると、全チャンネル(0~15)に同一の設 + 定を行う +  音程はOPMと同じ考え方となり、各音階間が64段階に分かれる + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +28:MPCM 音量設定 機能コード $25xx + trap #1 機能コード $05xx +───────────────────────────────────── + +機能: MPCMモードのチャンネルの再生音量を設定する + +呼出: D0.W $2500 + チャンネル番号 (0~15,255) + + D1.B 音量 (0~127) + +戻値: D0.L ≧ 0 :正常終了 + < 0 :異常終了 + +  チャンネル番号に 255 を指定すると、全チャンネル(0~15)に同一の設 + 定を行う +  音量の指定は、MPCM音量テーブル設定($A005)で指定された倍率を + 選択する形で行い、倍率を直接指定する訳ではない + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +29:MPCM PAN設定 機能コード $26xx + trap #1 機能コード $06xx +───────────────────────────────────── + +機能: MPCMモードのチャンネルの定位を設定する + +呼出: D0.W $2600 + チャンネル番号 (0~15,255) + + D1.B 定位 (0~3,$80~$FF) + 0 :無音 + 1 ,$80~$9F :左 + 2 ,$E0~$FF :右 + 3 ,$A0~$DF :中央 + +戻値: D0.L ≧ 0 :正常終了 + < 0 :異常終了 + +  チャンネル番号に 255 を指定すると、全チャンネル(0~15)に同一の設 + 定を行う +  各チャンネル独立しておらず、最新の設定に全チャンネルが影響される + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +30:MPCM PCM種類設定 機能コード $27xx + trap #1 機能コード $07xx +───────────────────────────────────── + +機能: MPCMモードのPCMの種類を設定する + +呼出: D0.W $2700 + チャンネル番号 (0~15,255) + + D1.B PCM種類 ($FF,0~2) + $FF :ADPCM + 0 :データ無し + 1 :16bitPCM + 2 :8bitPCM + +戻値: D0.L ≧ 0 :正常終了 + < 0 :異常終了 + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +31:MPCM KEY OFFモード設定(暫定) 機能コード $28xx + trap #1 機能コード $08xx +───────────────────────────────────── + +機能: MPCMモードのキーオフ時の処理を設定する + + MPCM.X が本機能をサポートしていないため、暫定仕様とする + +呼出: D0.W $2800 + チャンネル番号 (0~15,255) + + D1.B モード (0,1) + 0 :キーオフと同時に出力中止(デフォルト) + 1 :キーオフされたら、ループの終点へジャンプする +  ただし、ADPCM出力時は、出力されてから一度も +  ループの終点に達した事が無い場合、ジャンプせずに +  ループの終点まで出力してからループを抜ける + +戻値: D0.L ≧ 0 :正常終了 + < 0 :異常終了 + +  チャンネル番号に 255 を指定すると、全チャンネル(0~15)に同一の設 + 定を行う +  1を指定した場合、ADPCMの出力の場合は、出力後に一度でもルー + プの終点まで達していた場合のみループの終点にジャンプし、そうでない + 場合はループの終点まで出力した後にループを抜ける +  16bit/8bitPCM出力時には、即座にループの終点へジャンプする +  ループの終点に達した状態は、次にMPCMデータ登録($22xx)が行わ + れるまで保存される + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +32:MPCM 効果音再生 機能コード $30xx + trap #1 機能コード $10xx +───────────────────────────────────── + +機能: 効果音チャンネルでPCMを再生する + +呼出: D0.W $3000 + チャンネル番号 (0~7,224,255) + + D1.L 再生条件指定 + ビット + 31~24 :PCM種類 (0~2,$FF) + 0 :データ無し + 1 :16bitPCM + 2 :8bitPCM + $FF :ADPCM + + 23~16 :音量 (0~255) + 0~127 :音量指定 + 128~255 :原音量に固定 + + 15~ 8 :再生周波数 (0~6) + 0 : 3.9kHz + 1 : 5.2kHz + 2 : 7.8kHz + 3 :10.4kHz + 4 :15.6kHz + 5 :20.8kHz + 6 :31.2kHz + + 7~ 0 :定位 (0~3,$80~$FF) + 0 :無音 + 1 ,$80~$9F :左 + 2 ,$E0~$FF :右 + 3 ,$A0~$DF :中央 + + D2.L 出力するデータのバイト数 + ※16ビットPCM出力時には偶数を指定すること + + A1.L データ先頭アドレス + ※16ビットPCM出力時には偶数アドレスを指定すること + +戻値: D0.L ≧ 0 :割り当てたチャンネル番号 (0~7) + < 0 :異常終了 + +  チャンネル番号に 255 を指定すると、全チャンネル(0~7)に同一の設 + 定を行う +  チャンネル番号に 224($E0) を指定すると、効果音チャンネルの先頭か + ら空きチャンネルを探して出力する +  全部塞がっていた場合、残りの出力バイト数が一番少ないチャンネルを + 使用して出力する +  戻値は実際に割り当てたチャンネル番号(0~7)を返す + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +33:MPCM アレイチェーン効果音再生 機能コード $31xx + trap #1 機能コード $11xx +───────────────────────────────────── + +機能: 効果音チャンネルでアレイチェーンモードのPCMを再生する + +呼出: D0.W $3100 + チャンネル番号 (0~7,224,255) + + D1.L 再生条件指定 + MPCM効果音再生($30xx)と同じ + + D2.L 出力するアレイチェーンブロックの数 (1~65535) + + A1.L アレイチェーンブロック先頭アドレス + ※偶数アドレスを指定すること + +戻値: D0.L ≧ 0 :割り当てたチャンネル番号 (0~7) + < 0 :異常終了 + +  その他の注意点はMPCM効果音再生($30xx)を参照 +  アレイチェーンテーブルは1つのブロックが6バイトで構成される + 4バイト :PCMデータの先頭アドレス + 2バイト :PCMデータの長さ + 以下繰り返し + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +34:MPCM リンクアレイチェーン効果音再生 機能コード $32xx + trap #1 機能コード $12xx +───────────────────────────────────── + +機能: 効果音チャンネルでリンクアレイチェーンモードのPCMを再生する + +呼出: D0.W $3200 + チャンネル番号 (0~7,224,255) + + D1.L 再生条件指定 + MPCM効果音再生($30xx)と同じ + + A1.L リンクアレイチェーンブロック先頭アドレス + ※偶数アドレスを指定すること + +戻値: D0.L ≧ 0 :割り当てたチャンネル番号 (0~7) + < 0 :異常終了 + +  その他の注意点はMPCM効果音再生($30xx)を参照 +  リンクアレイチェーンテーブルは1ブロックが10バイトで構成される + 4バイト :PCMデータの先頭アドレス + 2バイト :PCMデータの長さ + 4バイト :次のリンクアレイチェーンテーブルのアドレス +  (= 0 ならテーブル終了) + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +35:MPCM 効果音停止 機能コード $33xx + trap #1 機能コード $13xx +───────────────────────────────────── + +機能: 効果音チャンネルの出力を停止する + +呼出: D0.W $3300 + チャンネル番号 (0~7,255) + +戻値: D0.L = 0 :正常終了 + +  チャンネル番号に 255 を指定すると、全チャンネル(0~7)を停止する + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +36:MPCM 占有 機能コード $A000 + trap #1 機能コード $8000 +───────────────────────────────────── + +機能: MPCMを常駐解除できないように占有する + +呼出: D0.W $A000 + + A1.L 占有するアプリケーション名の先頭アドレス + +戻値: D0.L = 0 :占有できた + < 0 :占有できなかった + +  MPCMの常駐を前提に常駐するアプリケーションは必ず占有する必要 + がある +  同時に占有できる数は32個まで +  文字列の長さは終端の $00 を含んで32バイト以内とし、もし32バイト + を越えた場合、内部では32バイト目からを切り捨てて $00 を置く + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +37:MPCM 占有解除 機能コード $A001 + trap #1 機能コード $8001 +───────────────────────────────────── + +機能: MPCMの占有を解除する + +呼出: D0.W $A001 + + A1.L アプリケーション名の先頭アドレス + +戻値: D0.L = 0 :占有解除できた + < 0 :占有解除できなかった + +  MPCMを占有したアプリケーションは、必ず終了時に占有を解除する + こと +  アプリケーション名は、MPCM占有($A000)で設定したものと同じに + する必要がある + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +38:MPCM 初期化 機能コード $A002 + trap #1 機能コード $8002 +───────────────────────────────────── + +機能: MPCMを初期化する + +呼出: D0.W $A002 + +戻値: D0.L = 0 :正常終了 + +  全チャンネルの設定値を初期化するので、呼出には注意 + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +39:MPU/MFPマスク設定 機能コード $A003 + trap #1 機能コード $8003 +───────────────────────────────────── + +機能: 割込中のMPU/MFP割込マスクを設定する + + MPU・MFPマスク設定($01FB)と同一機能 + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +40:MPCM 動作モード設定 機能コード $A004 + trap #1 機能コード $8004 +───────────────────────────────────── + +機能: MPCMの動作モードの設定 + +  現時点では機能しない + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +41:MPCM 音量テーブル設定 機能コード $A005 + trap #1 機能コード $8005 +───────────────────────────────────── + +機能: MPCMの音量テーブルを設定する + +呼出: D0.W $A005 + + D1.L 音量テーブル選択 + 0 ,1 :128段階モード(デフォルト) + -1 :ユーザー定義 + + A1.L ユーザー定義の音量テーブルアドレス (D1.L = -1 の時のみ) + +戻値: D0.L = 0 :正常終了 + +  音量変換に使う定数のテーブルを設定する +  テーブルは128個のワードからなっており、音量変換時の値(0~127) + に対応する +  倍率は テーブルの値/128 のため、原音量は 128 となる +  MPCMと異なり、16段階の指定は存在しない +  また、PCM8Aでは高速化のために、指定されたテーブルの値から内 + 部処理用の定数に変換を行い、音量変換時に乗算は使用しない + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +42:MPCM 効果音発声数指定 機能コード $A006 + trap #1 機能コード $8006 +───────────────────────────────────── + +機能: MPCMの効果音発声数を設定する + +呼出: D0.W $A006 + + D1.L 効果音発声数 (0~9) + +戻値: D0.L = 0 :正常終了 + +  PCM8A では、IOCS出力チャンネル数の指定と共通に扱う + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +43:PCM8A割り込みフラグチェック 機能コード $FFF0 +───────────────────────────────────── + +機能: PCM8Aが割り込み処理中かチェックする + +呼出: D0.W $FFF0 + +戻値: D0.L = 0 :割り込み処理中ではない + ≠ 0 :割り込み処理中 + +  一般のプログラムでは使ってはならない + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +44:PCM8A内部初期化 機能コード $FFF1 +───────────────────────────────────── + +機能: PCM8Aの全チャンネルと内部ワークを初期化する + +  動作モードは変わらない + +呼出: D0.W $FFF1 + +戻値: D0.L = 0 :正常終了 + +  一般のプログラムでは使ってはならない + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +45:ワークアドレス問い合わせ 機能コード $FFFC +───────────────────────────────────── + +機能: PCM8Aで使用しているワークエリアの情報を取得する + +呼出: D0.W $FFFC + + D1.W ワークエリア番号 + = 0 :PCMバッファ + = 1 :ADPCMバッファ + = 2 :チャンネルバッファ + = 3 :PCM→ADPCMテーブル + = 4 :ADPCM→PCMテーブル + +戻値: D0.L ≧ 0 :バッファ/テーブルの先頭アドレス + +  一般のプログラムでは使ってはならない +  戻値で示されたアドレスから、直接メモリ管理ポインタのアドレスを求 + める事はできません。 + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +46:使用ベクタ問い合わせ 機能コード $FFFD +───────────────────────────────────── + +機能: PCM8Aで使用しているベクタの情報を取得する + +呼出: D0.W $FFFD + + D1.W ベクタ番号 + +戻値: D0.L = -1 :使用していないベクタ番号である + = -2 :組み込まれていないため、未使用である +  (TRAP #1 が他のプログラムで占有されていた場合、 +   この値が返ります) + 上記以外:元のベクタアドレス + +  一般のプログラムでは使ってはならない + +  PCM8Aで使用しているベクタは以下の通りです + + 番号 + $0021 TRAP #1 + $0022 TRAP #2 + $006A DMAC ch.3 通常割り込み + $006B DMAC ch.3 エラー割り込み + $0160 IOCS _ADPCMOUT + $0161 IOCS _ADPCMINP + $0162 IOCS _ADPCMAOT + $0163 IOCS _ADPCMAIN + $0164 IOCS _ADPCMLOT + $0165 IOCS _ADPCMLIN + $0166 IOCS _ADPCMSNS + $0167 IOCS _ADPCMMOD + +  なお、ベクタ番号に $0000 を指定すると、PCM8Aの先頭アドレス + を返します + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +47:(reserved) 機能コード $FFFE +───────────────────────────────────── + + 本コールは予約されています + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +48:常駐解除 機能コード $FFFF +───────────────────────────────────── + +機能: PCM8Aの常駐を解除する + +呼出: D0.W $FFFF + +戻値: D0.L = 0 :常駐が正常に解除された + = -1 :占有されており、解除できなかった + = -2 :ベクタが変更されており、解除できなかった + +  一般のプログラムでは使ってはならない + + +※注意 +  $FFF0 , $FFF1 , $FFFD , $FFFC のコールを使用する場合、必ず PCM8A + が常駐していることを確認してから実行してください。 +  PCM8.X が常駐している状態でこれらのコールを使用すると、常駐解除 + ($FFFFコール)と解釈されてしまう可能性があります。 + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +5.PCM8A IOCSコール + + 5-1 対象コール + + $60 _ADPCMOUT チェーンなし出力 + $62 _ADPCMAOT アレイチェーン出力 + $64 _ADPCMLOT リンクアレイチェーン出力 + $66 _ADPCMSNS ADPCM実行モードセンス + $67 _ADPCMMOD ADPCM実行制御 + +  PCM8Aは、上記以外のADPCM関連のコールも全て管理します。 + + 5-2 元のIOCSとの差異 + +  5-2-1 多重再生モード + + (1) 前の音の出力中に、続いて出力を行った場合、前の音の出力終了 +    を待たず、他のチャンネルを使用して出力を合成します。 + +     この場合、空いているチャンネルを、チャンネル番号の大きいも +    のから順に使用します。 +     このとき、空きのない場合は、チェーンなし出力中のチャンネル +    の内、残りバイト数の一番短いものを潰して出力します。 +     それでも該当するチャンネルが無い場合コールは無視し、復帰値 +    を D0.L = -1 としてリターンします。 + +     チャンネルサーチでは、チャンネル一時停止($00Bxコール)等 +    で一時停止状態にあるチャンネルでも空いていると判断して、勝手 +    に出力を割り当ててしまうので注意が必要です。 + + (2) 通常出力($60コール)及び通常入力($61コール)では、出力バ +    イト数が $FF00 以上でもすぐリターンします。 + + (3) 定位は最新の指定に従いますが、出力カットの指定は無視します。 +     定位変更時は先に出力中の残響も影響を受けてしまいます。 + + (4) ADPCM実行制御($67コール)で終了を指定すると、チェー +    ン動作の終了となります。 +     このとき、現在出力中のデータブロックはそのまま出力されます。 +     即時終了する場合は、中止指定を行ってから終了を指定すること。 + +     中止指定の後、終了指定または他の音の再生指定を行うと、元の +    出力は全てキャンセルされます。 +     中止指定後は再開指定による継続出力も可能ですが、キャンセル +    された出力の継続出力はできません。 + +     なお、ファンクションコールによる出力は、本コールによる影響 +    を受けません。 + + (5) ADPCM実行モードセンス($66コール)は、最後に行われた +    IOCSコールの状態を返します。 + + (6) 入力処理中には、入力処理が完了するまで出力要求を全てキャン +    セルします。 +     このときの復帰値は D0.L = -1 となります。 + +  5-2-2 単音再生モード + + (1) 前の音の出力中に、続いて出力を行った場合、前の音の出力終了 +    を待たず、前の音の出力を取り消して出力します。 +     また、入力に関しても出力と同様になります。 + + (2) 通常出力($60コール)及び通常入力($61コール)では、出力バ +    イト数が $FF00 以上でもすぐリターンします。 + + (3) 入力処理中には、入力処理が完了するまで出力要求を全てキャン +    セルします。 +     このときの復帰値は D0.L = -1 となります。 + +  5-2-3 その他 + + (1) IOCS コールでは、16bit PCM , 8bit PCM の入出力はできません。 + + (2) IOCS コールの音量は原音固定です。 + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +6.PCM8A常駐判定方法 + +  PCM8Aファンクションコールを使用する場合は、予め常駐判定を + 行っておく必要があります。 + +  常駐判定には、以下の方式を推奨します。 + + 6-1 トラップベクタ取得方式 + +  例外ベクタ $0022( trap #2 エントリ:絶対番地= $0088 )の内容で + 示されたアドレスの手前16バイトをチェックします。 + +  先頭から5バイトが 'PCM8A' で、3バイトスキップして、続く8バイ + トが 'PCM8/048' ならば常駐しています。 +  なお、スキップした3バイトはバージョンを示しています。 + ( 例:version 1.00 = 'PCM8A100PCM8/048' ) + + 6-2 IOCSコール方式(簡略方式) + +  D1.L に 定数 'PCMA' を設定して、IOCS $67(_ADPCMMOD)を実行し、 + 戻り値 D0.L ≧ 0 であれば PCM8A は常駐しており、バージョンは + D0.L / 100(10進)で示されます。 + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +7.注意事項/他 + + 7-1 OPMレジスタアクセスについて + +  PCM8Aは、OPMレジスタをアクセスする場合があります。 + +  アクセスレジスタは $1B で、システムワーク $09DA を参照して値を決 + 定するため、他のアプリケーションではシステムワークと実際の設定内容 + の食い違いが起こらないように注意する必要があります。 + + 7-2 PCM8A組み込み制御について + +  音源ドライバが独自にADPCM処理を行う場合など、後からPCM8 + Aが組み込まれると都合が悪い場合は、trap #2 のエントリ(絶対番地= + $0088)にダミーのアドレス($00F00000 未満)を設定しておくと、PC + M8Aの組み込みを禁止できます。 + + 7-3 システムワーク $0C32 について + +  ROM内部ルーチンによる処理では、$0C32 にはADPCMの動作状態 + が格納されていますが($00,$02,$04,$12,$14,$22,$24,$82,$84 のいずれ + かの値が入る)、PCM8AがADPCMを管理している状態では、ここ + に $42 を格納します。 + + 7-4 過負荷状態について + +  過負荷状態とは、PCM8Aの割込み処理がある時間以内に終了しな + かったために、ADPCM出力が停止してしまう状態を指します。 + +  この状態になる原因として、同時動作チャンネル数が多すぎる場合以外 + にも、PCM8Aの割り込み処理中に入った別の割り込み処理の時間が長 + い場合や、割り込みレベル3以上の時間が長くなった等の原因で、PCM + 8Aの割り込みが長時間禁止されたり、強制的に処理時間を引き伸ばされ + てしまった場合が考えられます。 + +  なお、PCM8Aは過負荷状態になると、出力処理を数回繰り返し、過 + 負荷状態が一時的なものであればそのまま出力を継続しますが、過負荷状 + 態から回復しない場合には、全チャンネルの出力を強制的に停止します。 + +  ただし、過負荷状態になるとノイズが出力されたり、出力の音量が不自 + 然に変化してしまう事があるため、過負荷状態での使用はできるだけ避け + てください。 + + 7-5 多重割り込みについて + +  PCM8Aの割り込み処理中に更に割り込みを行い、その割り込み処理 + から出力命令を実行することができます。 + +  ただし、動作モードの切り替え(多重再生モードと、単音再生モードの + 切り替え)や入力命令(IOCSの _ADPCMINP, _ADPCMAIN, _ADPCMLIN) + は、割込み処理中に実行しないでください。 + + 7-6 出力停止状態について + +  ADPCM/PCMデータのポインタとしてメモリの存在しないアドレ + スを指定したために、PCM8Aの割り込み処理中にバスエラーを起こし + た場合や、INTERRUPT スイッチでPCM8Aの割り込み処理中に停止させ、 + そのまま割り込み処理から抜けてしまった場合には、PCM8A内部の割 + り込み処理フラグが立ったままとなり、出力ができない状態になります。 + +  この状態の検出は、割り込み処理以外のプログラムから $FFF0 コール + (PCM8A割り込みフラグチェック)を実行することで確認できます。 + +  出力停止状態になっている場合、コマンドラインからは PCM8A CLR と + 入力することで復帰します。 +  また、プログラムで復帰させる場合、スーパーバイザモードで、以下の + プログラムを実行することで復帰します。 + + move.w sr,-(sp) + ori.w #$0700,sr ←割り込み禁止 + moveq #$F0,d0 + trap #2 ←割り込み処理中フラグチェック + tst.l d0 + beq P8A_OK ←正常なら何もしない + moveq #$F1,d0 + trap #2 ←出力が停止しているので内部初期化 + P8A_OK: move.w (sp)+,sr ←割り込み許可 + + 7-7 ADPCM独占方法 + +  PCM8AがADPCMを管理している時に、一時的にADPCMを独 + 占する必要がある場合、PCM8Aを強制的に停止させた後に、$0C32 に + $00,$42 以外の値を設定してください。 +  実際の設定値は、出力時には $02,$12,$22、入力時には $04,$14,$24 + のいずれかの値の設定を推奨します。 + (『7-3 システムワーク $0C32 について』を参照) +  ADPCMの一時的な使用が終了した場合、$0C32 に $00 を設定して + おけば、PCM8Aに対する出力要求が発生した時点で、ADPCMの管 + 理はPCM8Aに戻ります。 + + 7-8 TRAP #1 の扱いについて + +  PCM8Aは常駐時に trap #1 が MPCM.X 以外のプログラムで占有さ + れていた場合、trap #1 のベクタを変更せずに、trap #2 のベクタのみを + 使用して常駐するため、MPCM.X 相当の機能は trap #2 コールを介して使 + 用する事しかできなくなります。 +  なお、trap #1 の占有チェックは、trap #1 のベクタが $00F00000未満 + を指していることで判断しています。 + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +8.音量変換の詳細について + + 音量変換の詳細情報は以下の通りです。 + +  音量設定値 レベル  dB ADPCM 倍率 PCM 倍率※ + + $40 -64 -53.0 0.0022 0.0024 (5/2048) + $41 -63 -52.2 0.0025  ↑ + $42 -62 -51.3 0.0027 0.0029 (3/1024) + $43 -61 -50.5 0.0030  ↑ + $44 -60 -49.7 0.0033  ↑ + $45 -59 -48.8 0.0036 0.0039 (1/256) + $46 -58 -48.0 0.0040  ↑ + $47 -57 -47.2 0.0044  ↑ + $48 -56 -46.4 0.0048 0.0049 (5/1024) + $49 -55 -45.5 0.0053  ↑ + $4A -54 -44.7 0.0058 0.0059 (3/512) + $4B -53 -43.9 0.0064  ↑ + $4C -52 -43.0 0.0070 0.0078 (1/128) + $4D -51 -42.2 0.0077  ↑ + $4E -50 -41.4 0.0085  ↑ + $4F -49 -40.6 0.0094 0.0098 (5/512) + $50 -48 -39.7 0.010  ↑ + $51 -47 -38.9 0.011 0.012 (3/256) + $52 -46 -38.1 0.012  ↑ + $53 -45 -37.3 0.014  ↑ + $54 -44 -36.4 0.015 0.016 (1/64) + $55 -43 -35.6 0.016  ↑ + $56 -42 -34.8 0.018  ↑ + $57 -41 -33.9 0.020 0.023 (3/128) + $58 -40 -33.1 0.022  ↑ + $59 -39 -32.3 0.024  ↑ + $5A -38 -31.5 0.026  ↑ + $5B -37 -30.6 0.029 0.031 (1/32) + $5C -36 -29.8 0.032  ↑ + $5D -35 -29.0 0.035 0.039 (5/128) + $5E -34 -28.1 0.039  ↑ + $5F -33 -27.3 0.043 0.047 (3/64) + $60 -32 -26.5 0.047  ↑ + $61 -31 -25.7 0.052  ↑ + $62 -30 -24.8 0.057 0.063 (1/16) + $63 -29 -24.0 0.063  ↑ + $64 -28 -23.2 0.069 0.078 (5/64) + $65 -27 -22.3 0.076  ↑ + $66 -26 -21.5 0.084 0.094 (3/32) + $67 -25 -20.7 0.092  ↑ + $68 -24 -19.9 0.10  ↑ + $69 -23 -19.0 0.11 0.13 (1/8) + $6A -22 -18.2 0.12  ↑ + $6B,$00 -21 -17.4 0.13  ↑ + $6C -20 -16.6 0.15 0.16 (5/32) + $6D -19 -15.7 0.16  ↑ + $6E -18 -14.9 0.18 0.19 (3/16) + $6F,$01 -17 -14.1 0.20  ↑ + $70 -16 -13.2 0.21 0.25 (1/4) + $71,$02 -15 -12.4 0.24  ↑ + $72 -14 -11.6 0.26  ↑ + $73 -13 -10.8 0.29 0.31 (5/16) + $74,$03 -12 -9.9 0.32  ↑ + $75 -11 -9.1 0.35 0.38 (3/8) + $76,$04 -10 -8.3 0.39  ↑ + $77 -9 -7.5 0.42  ↑ + $78 -8 -6.6 0.47 0.50 (1/2) + $79,$05 -7 -5.8 0.51  ↑ + $7A -6 -5.0 0.56 0.63 (5/8) + $7B,$06 -5 -4.1 0.62  ↑ + $7C -4 -3.3 0.68  ↑ + $7D,$07 -3 -2.5 0.75 0.75 (3/4) + $7E -2 -1.7 0.83  ↑ + $7F -1 -0.8 0.91 1.00 + + $80,$08 0 0 1.00 1.00 + + $81 +1 +0.8 1.10 1.00 + $82,$09 +2 +1.7 1.21 1.25 (5/4) + $83 +3 +2.5 1.33  ↑ + $84,$0A +4 +3.3 1.46 1.50 (3/2) + $85 +5 +4.1 1.61  ↑ + $86 +6 +5.0 1.77 2.00 + $87,$0B +7 +5.8 1.95  ↑ + $88 +8 +6.6 2.14  ↑ + $89 +9 +7.5 2.36 2.50 (5/2) + $8A,$0C +10 +8.3 2.60  ↑ + $8B +11 +9.1 2.85 3.00 + $8C,$0D +12 +9.9 3.14  ↑ + $8D +13 +10.8 3.46  ↑ + $8E +14 +11.6 3.80 4.00 + $8F,$0E +15 +12.4 4.18  ↑ + $90 +16 +13.2 4.61 5.00 + $91,$0F +17 +14.1 5.06  ↑ + $92 +18 +14.9 5.56 6.00 + $93 +19 +15.7 6.13  ↑ + $94 +20 +16.6 6.75  ↑ + $95 +21 +17.4 7.43 8.00 + $96 +22 +18.2 8,17  ↑ + $97 +23 +19.0 8.97  ↑ + $98 +24 +19.9 9.89 10.00 + $99 +25 +20.7 10.85  ↑ + $9A +26 +21.5 11.94 12.00 + $9B +27 +22.3 13.15  ↑ + $9C +28 +23.2 14.50 16.00 + $9D +29 +24.0 16.00  ↑ + $9E +30 +24.8 17.64  ↑ + $9F +31 +25.7 19.40 20.00 + $A0 +32 +26.5 21.26  ↑ + + ※8ビットPCMでは $40~$53 は倍率が 0 になります + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + \ No newline at end of file diff --git a/src/pcm8avup.doc b/src/pcm8avup.doc new file mode 100644 index 0000000..47fa500 --- /dev/null +++ b/src/pcm8avup.doc @@ -0,0 +1,474 @@ + PCM8Aバージョンアップ履歴 + +0.00~0.41 省略 + +0.42 94/5/4 + PCM→ADPCM変換テーブルを少々変更。ノイズが減少した。 + +0.43 94/5/22 + PCM8.X が常駐している状態で PCM8A CLR とすると、PCM8.X を常駐解除して + しまうバグを修正。 + IOCSで、キャンセルした出力が一時停止解除で出力されてしまうバグを修 + 正。これに伴い、IOCS一時停止解除禁止フラグを追加。 + $FFF0 コール(PCM8A割り込みフラグチェック)、$FFF1 コール(PCM + 8A内部初期化)を正式サポートしてマニュアルに追加。 + +0.44 94/6/8 + ラスター割り込み対応を少々。 + 数字から始まるマクロ名の修正(HAS v3.x でアセンブルできなかった)。 + ファンクションコール処理を少し高速化。 + +0.45 94/6/23 + 割り込みマスク処理を少し変更。 + 定位変更処理を少し変更。 + +0.46 94/7/8 + ADPCM→PCM変換の高速化少々。 + +0.47 94/8/20 + 定位変更時のノイズを少し低減。 + PCM8.X に対する PCM8A CLR の処理を少し変更。 + 未公開だった拡張チャンネル用ファンクションコールを公開。 + 単音再生時に再生周波数や定位の変更ができなかったのを修正。 + +0.48 94/10/2 + ラスター割り込みへの配慮を少し強化 + +0.50 95/1/31 + チャンネル数・処理バイト数・音量可変範囲を常駐時及び常駐後に変更可能に + した。 + 周波数範囲を拡張( 20.8kHz と 31.2kHz を追加)。 + 機能追加と、ループ展開の減少により、10MHzマシンでは更に重くなって + しまったが、68030の命令キャッシュがかなり効くようになった。 + ADPCMのクロックアップに暫定対応(したつもり)。 + 040turboに暫定対応(していないかもしれない)。 + +0.51 95/4/24 + 単音再生モードで出力停止(D0=$000x,$001xでD2=0)を行うと、ADPCMの周波数 + モードを変更してしまうバグを修正。 + PCM8ATEC.DOCのミスを修正($01F8コールのシステム情報取得の指定方法) + +0.52 95/6/18 + v0.51で入れてしまったゴミのコードを削除。(動作に関係無し) + コピーバックキャッシュ対応を多少強化。 + 設定可能な最大チャンネル数を250に増やした。(こんなに必要無いと思うが) + デバイスドライバ組み込み時のエラーチェックのミスを修正。 + IOCSのADPCM入力処理で、まれにハングする可能性が有ったのを含めて、IOCS + 周りをかなり修正。 + '-W'オプションによるバッファ/テーブル分離機能を追加。 + 68000搭載機種のためにループの展開量を増やした。(68030のキャッシュが少 + し効きにくくなってしまった) + 割り込み処理中の処理バイト数変更の説明を追加(v0.50から対応はしていた) + ADPCMの横取り方法についての説明を追加($0C32の説明中) + +0.53 95/6/23 + v0.52で追加した'-W'オプションの影響で、常駐時のメモリ不足で trap #2 + ベクタを破壊してしまうバグを修正。 + Xellent30シリーズ正式対応。 + (報告ありがとうございます: P.E.I.さん , E.Watanabe さん ) + +0.54 95/11/12 + 常駐時、環境変数の参照をミスするバグを修正。 + I/Oアドレスの最上位8ビットを $FF に変更。(アドレス空間拡張対応) + 割り込みマスクの復帰方法を変更。 + 31.2kHzのPCMを20.8kHzに変換する処理のバグを修正。 + ADPCM停止中に残る音を無くした。(そのかわり開始時に歪みが出やすい) + +0.55 95/11/19 + 常駐時に発生するノイズを削減 + 発声開始時に出る独特なノイズを少しだけ削減 + +0.56 95/12/12 + 040turboに正式対応。 + (協力ありがとうございます: カップめん さん) + v0.55でワークエリアのアライメントがずれていたのを修正。 + +0.57 95/12/19 + 16Mバイト以上のアドレスに常駐すると常駐解除できなくなるバグを修正。 + これによりハイメモリ常駐に対応 + (報告及びアドバイスありがとうございます: E.Watanabe さん) + +0.58 96/2/1 + 複数のチャンネルで定位指定が異なっていた場合に、フェードアウトすると定 + 位が変になる不具合を修正。 + +0.59 96/4/18 + ADPCMクロックアップモードに3と4を追加。 + クロックアップの自動判定が(多少?)正確になった。 + +0.60 96/11/6 + ADPCMクロックアップに正式対応(プログラムは変わっていない)。 + ADPCM強制停止時に発生するノイズを少し低減。 + -Sオプションで音量の下限/上限を変更した時に、正しく設定されない事があ + る不具合を修正。 + +0.99 96/12/4 + ZMUSIC V3 CD-ROMに収録 + MPCM.X相当の音量/音程変換機能を搭載 + テストバージョンのためバグ多数 + +1.00 97/1/5 + 音程変換時の音質を向上 + ADPCMの動作周波数範囲を拡張(3.9k,5.2k,7.8k,10.4kを追加) + MPCM.X相当の trap #1 の機能を trap #2 コールにも追加 + 効果音出力処理のバグを多数修正 + +1.01 97/1/12 + 音程変換時の発声終了時にノイズが入る事があるバグを修正 + -Sオプションで動作モードを表示する機能を追加 + キーオフ時の動作で、ループ終点へのジャンプの設定を行った時に、16/8bit + PCMは常にジャンプするように変更 + +1.02 97/9/2 + ADPCM強制停止時の処理を変更 + 出力停止処理(TRAP2,IOCS)のバグを修正 + 常駐チェック処理を変更 + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +●その他の仕様について + +1)ADPCMのクロックアップ対応 + + Oh!X 1994年8月号掲載の瀧氏の記事「内蔵AD PCM高音質化計画」に +従い、仕様の拡張及び追加を行いました。 + + なお、MODE3/MODE4 については NIFTY-Serve FSHARPU MES 8 の 阿吽 さん 及び + TED さん の提案と、E.Watanabe さんの実験結果を参考にさせて頂きました。 + + 仕様の詳細は以下の通りです。 + + +★ADPCMクロックアップ対応モード + + 以下のモードをサポートしています。 + + MODE0 :無改造時に指定 +  OPMのCT1ピンで 4MHz/8MHz の切り替えを行います。 +  -F オプションで 0 以外を指定しても無視します。 + + MODE1 :Oh!X掲載の回路に従った改造を行った場合に指定 +  OPMのCT1ピンで 16MHz/8MHz の切り替えを行います。 + + MODE2~4:従来の周波数をそのまま残して、クロックアップのモードを追加 +  する改造を行った場合に指定 +  幾つかの信号を元に 4MHz/8MHz/16MHz の切り替えを行います。 + + 環境変数を参照する場合、以下のように設定されている必要があります。 + + MODE0 :OPM_CT1が未定義 , OPM_CT1=4 , OPM_CT1=M0 + MODE1 :OPM_CT1=16 , OPM_CT1=M1 + MODE2 :OPM_CT1=4/16 , OPM_CT1=16/4 , OPM_CT1=M2 + MODE3 :OPM_CT1=M3 + MODE4 :OPM_CT1=M4 + + ・コマンドラインのオプションによる指定 + + -M[n] : ADPCMクロックモード指定 (通常:0) + n = 0 :4M/8M (MODE0) + 1 :16M/8M (MODE1) + 2 :4M/8M/16M (MODE2) + 3 : 〃 (MODE3) + 4 : 〃 (MODE4) + (単位:Hz) + A :自動判定(MODE0~4を自動判別します) + 省略 :環境変数(OPM_CT1)参照 + + -F[n] : 動作基準周波数指定 (通常:0) + n = 0 :15.6k + 1 :20.8k + 2 :31.2k + 4 : 3.9k + 5 : 5.2k + 6 : 7.8k + 7 :10.4k + (単位:Hz) + 省略 :最高周波数(-M[n] の指定による) + + ・ファンクションコールによる指定 + + 呼出: D0.W $01F7 + + D1.L < 0 :ADPCMモード取得 + ≧ 0 :ADPCMモード設定 + + ビット + 31~16 :無効 + (0をセットしておくこと) + 15~ 8 :ADPCMクロックモード + $FF :前の値を保持 + 0 :4M/8M (MODE0) + 1 :16M/8M (MODE1) + 2 :4M/8M/16M (MODE2) + 3 : 〃 (MODE3) + 4 : 〃 (MODE4) + (単位:Hz) + 7~ 0 :動作基準周波数 + $FF :前の値を保持 + 0 :15.6k + 1 :20.8k + 2 :31.2k + 4 : 3.9k + 5 : 5.2k + 6 : 7.8k + 7 :10.4k + (単位:Hz) + + 戻値: D0.L (変更前の)ADPCMモード情報 + + ビット + 15~ 8 :ADPCMクロックモード + 0 :4M/8M (MODE0) + 1 :16M/8M (MODE1) + 2 :4M/8M/16M (MODE2) + 3 : 〃 (MODE3) + 4 : 〃 (MODE4) + (単位:Hz) + 7~ 0 :動作基準周波数 + 0 :15.6k + 1 :20.8k + 2 :31.2k + 4 : 3.9k + 5 : 5.2k + 6 : 7.8k + 7 :10.4k + (単位:Hz) + ※他のビットは 0 + + 以下に、それぞれの回路の略図と真理値表を示します。 + + MODE0 + + 無改造の回路そのままのため、回路図は省略 + + 真理値表 + ┌────┬────┬────┬──────┐ + │ OPM CT1│ PPI PC3│ PPI PC2│ADPCM 周波数│ + ├────┼────┼────┼──────┤ + │ 1 │ 0 │ 0 │ 3.9kHz │ + ├────┼────┼────┼──────┤ + │ 1 │ 0 │ 1 │ 5.2kHz │ + ├────┼────┼────┼──────┤ + │ 1 │ 1 │ 0 │ ( 7.8kHz) │ + ├────┼────┼────┼──────┤ + │ 0 │ 0 │ 0 │ 7.8kHz │ + ├────┼────┼────┼──────┤ + │ 0 │ 0 │ 1 │ 10.4kHz │ + ├────┼────┼────┼──────┤ + │ 0 │ 1 │ 0 │ 15.6kHz │ + ├────┼────┼────┼──────┤ + │ 0/1 │ 1 │ 1 │ 無効 │ + └────┴────┴────┴──────┘ + + + MODE1 + 74HC157 + OPM CT1 →───┐1 + ┏━┷━┓ + 2┃ S ┃ + 8MHz →─┨1A ┃4 + 3┃ 1Y┠─→ MSM6258 XT + 16MHz →─┨1B ┃ + 15┃ ┃ + GND(0V) ──┨G ┃ + ┗━━━┛ + + 真理値表 + ┌────┬────┬────┬──────┐ + │ OPM CT1│ PPI PC3│ PPI PC2│ADPCM 周波数│ + ├────┼────┼────┼──────┤ + │ 0 │ 0 │ 0 │ 7.8kHz │ + ├────┼────┼────┼──────┤ + │ 0 │ 0 │ 1 │ 10.4kHz │ + ├────┼────┼────┼──────┤ + │ 0 │ 1 │ 0 │ 15.6kHz │ + ├────┼────┼────┼──────┤ + │ 1 │ 0 │ 0 │ (20.8kHz) │ + ├────┼────┼────┼──────┤ + │ 1 │ 0 │ 1 │ 20.8kHz │ + ├────┼────┼────┼──────┤ + │ 1 │ 1 │ 0 │ 31.2kHz │ + ├────┼────┼────┼──────┤ + │ 0/1 │ 1 │ 1 │ 無効 │ + └────┴────┴────┴──────┘ + + + MODE2 + 74HC352 + PPI PC3 →────┐ + │ + OPM CT1 →──┐2 │14 + ┏┷━┷┓ + 6┃B A┃ + ┌─┨1C0 ┃ + 8MHz →┤ 5┃ ┃ + └─┨1C1 ┃7 + 4┃ 1Y┠─→ MSM6258 XT + 4MHz →──┨1C2 ┃ + 3┃ ┃ + 16MHz →──┨1C3 ┃ + 1┃ ┃ + GND(0V) ───┨1G ┃ + ┃ ┃ + 10┃ ┃ + VCC(5V) ───┨2C0 ┃ + 11┃ ┃ + GND(0V) ───┨2C1 ┃9 + 12┃ 2Y┠─→ MSM6258 S2 + VCC(5V) ───┨2C2 ┃ + 13┃ ┃ + PPI PC2 →──┨2C3 ┃ + 15┃ ┃ + GND(0V) ───┨2G ┃ + ┗━━━┛ + + 真理値表 + ┌────┬────┬────┬──────┐ + │ OPM CT1│ PPI PC3│ PPI PC2│ADPCM 周波数│ + ├────┼────┼────┼──────┤ + │ 1 │ 0 │ 0 │ 3.9kHz │ + ├────┼────┼────┼──────┤ + │ 1 │ 0 │ 1 │ 5.2kHz │ + ├────┼────┼────┼──────┤ + │ 0 │ 0 │ 0 │ 7.8kHz │ + ├────┼────┼────┼──────┤ + │ 0 │ 0 │ 1 │ 10.4kHz │ + ├────┼────┼────┼──────┤ + │ 0 │ 1 │ 0 │ 15.6kHz │ + ├────┼────┼────┼──────┤ + │ 1 │ 1 │ 1 │ 20.8kHz │ + ├────┼────┼────┼──────┤ + │ 1 │ 1 │ 0 │ 31.2kHz │ + ├────┼────┼────┼──────┤ + │ 0 │ 1 │ 1 │ 無効 │ + └────┴────┴────┴──────┘ + + + MODE3 + 74HC00 + 1┏━━━┓ + PPI PC3 →──┨1A ┃3 74HC157 + 2┃ 1Y┠───────────┐ + PPI PC2 →──┨1B ┃ │1 + 4┃ ┃ ┏━┷━┓ + ┌─┨2A ┃6 2┃ S ┃ + OPM CT1 →┤ 5┃ 2Y┠─┐ 16MHz →──┨1A ┃4 + ├─┨2B ┃ │ 3┃ 1Y┠─→ MSM6258 XT + │ ┗━━━┛ │ 4/8MHz →──┨1B ┃ + │ │ 5┃ ┃ + └───────────────┨2A ┃7 + │ 6┃ 2Y┠─→ MSM6258 S2 + │PPI PC3 →──┨2B ┃ + │ 11┃ ┃ + └───────┨3A ┃9 + 10┃ 3Y┠─→ MSM6258 S1 + PPI PC2 →──┨3B ┃ + 15┃ ┃ + GND(0V) ───┨G ┃ + ┗━━━┛ + + 真理値表 + ┌────┬────┬────┬──────┐ + │ OPM CT1│ PPI PC3│ PPI PC2│ADPCM 周波数│ + ├────┼────┼────┼──────┤ + │ 1 │ 0 │ 0 │ 3.9kHz │ + ├────┼────┼────┼──────┤ + │ 1 │ 0 │ 1 │ 5.2kHz │ + ├────┼────┼────┼──────┤ + │ 1 │ 1 │ 0 │ ( 7.8kHz) │ + ├────┼────┼────┼──────┤ + │ 0 │ 0 │ 0 │ 7.8kHz │ + ├────┼────┼────┼──────┤ + │ 0 │ 0 │ 1 │ 10.4kHz │ + ├────┼────┼────┼──────┤ + │ 0 │ 1 │ 0 │ 15.6kHz │ + ├────┼────┼────┼──────┤ + │ 0 │ 1 │ 1 │ 20.8kHz │ + ├────┼────┼────┼──────┤ + │ 1 │ 1 │ 1 │ 31.2kHz │ + └────┴────┴────┴──────┘ + + + MODE4 + 74HC00 + 1┏━━━┓ + PPI PC3 →──┨1A ┃3 74HC157 + 2┃ 1Y┠───────────┐ + PPI PC2 →──┨1B ┃ │1 + 4┃ ┃ ┏━┷━┓ + ┌─┨2A ┃6 2┃ S ┃ + OPM CT1 →┤ 5┃ 2Y┠─┐ 16MHz →──┨1A ┃4 + ├─┨2B ┃ │ 3┃ 1Y┠─→ MSM6258 XT + │ ┗━━━┛ │ 4/8MHz →──┨1B ┃ + │ │ 5┃ ┃ + │ └───────┨2A ┃7 + │ 6┃ 2Y┠─→ MSM6258 S2 + │ PPI PC3 →──┨2B ┃ + │ 11┃ ┃ + └───────────────┨3A ┃9 + 10┃ 3Y┠─→ MSM6258 S1 + PPI PC2 →──┨3B ┃ + 15┃ ┃ + GND(0V) ───┨G ┃ + ┗━━━┛ + + 真理値表 + ┌────┬────┬────┬──────┐ + │ OPM CT1│ PPI PC3│ PPI PC2│ADPCM 周波数│ + ├────┼────┼────┼──────┤ + │ 1 │ 0 │ 0 │ 3.9kHz │ + ├────┼────┼────┼──────┤ + │ 1 │ 0 │ 1 │ 5.2kHz │ + ├────┼────┼────┼──────┤ + │ 1 │ 1 │ 0 │ ( 7.8kHz) │ + ├────┼────┼────┼──────┤ + │ 0 │ 0 │ 0 │ 7.8kHz │ + ├────┼────┼────┼──────┤ + │ 0 │ 0 │ 1 │ 10.4kHz │ + ├────┼────┼────┼──────┤ + │ 0 │ 1 │ 0 │ 15.6kHz │ + ├────┼────┼────┼──────┤ + │ 1 │ 1 │ 1 │ 20.8kHz │ + ├────┼────┼────┼──────┤ + │ 0 │ 1 │ 1 │ 31.2kHz │ + └────┴────┴────┴──────┘ + + +2)-Wオプションの特殊機能 + + -Wオプションは以下のような使い方もできますが、使用には注意が必要です。 + +  a) -W2,$800000,16,$900000 + + この場合、ADPCMバッファの先頭を絶対番地の $800000 に設定し、ADPCM→PCM変換 +テーブルの先頭を $900000 に設定することになります。 + 指定した領域を他のプログラムが使用することの無いように注意してください。 + +  b) -W1,,2,,4,,8,,16 + + この場合、5つのバッファ/テーブルを全て別々に MALLOC で領域確保を行います。 + なお、1つの領域に対して2回以上指定した場合には、後から指定した方が有効にな +ります。 + + あまり使い道は無いと思われますが、こういった指定も可能です。 + + +3)-Zオプションについて + + PCM8Aが管理しているテーブルを誤って他のプログラムで壊してしまった場合、 +コマンドラインから PCM8A -Z と入力することで、テーブルを再作成します。 + 常駐しているPCM8Aと同じバージョンのPCM8Aで実行する必要があります。 + + +●参考文献及びドキュメント + + 1)瀧 康史:「内蔵AD PCM高音質化計画」 +         ソフトバンク株式会社 Oh!X 1994年8月号 + + 2)桑野雅彦:「Outside X68000」ソフトバンク株式会社 + + 3)桑野雅彦:「X68030 Inside/Out」ソフトバンク株式会社 + + 4)「'88最新TTL IC規格表」CQ出版社 + +(EOF) + \ No newline at end of file