msx-sdcc @ ウィキ内検索 / 「ソースの動作確認」で検索した結果

検索 :
  • ソースの動作確認
    SDCCでコンパイルしたソースコードをその場でチェックする方法があると便利。 CP/Mエミュレータを利用すれば、コンパイルしたバイナリをその場で動作確認可能。 CP/Mエミュレータは以下からダウンロードできる。 このエミュレーターはWindowsコマンドプロンプト環境で動作するので、 コンパイル後の動作チェックに向いている。 CP/M Player for Win32 ※このエミュレータは全てのCP/Mファンクションコールを再現していないので注意。 またMSXDOS用でもないので、完全なエミュレーションは期待できない。 コンソール動作もやや怪しいが簡単な動作確認は可能だろう。
  • sdasのマクロアセンブラ機能について
    マクロアセンブラ機能 sdccに付属するZ80のアセンブラにはマクロ機能が追加されている。 このマクロ機能はマイクロソフトのM80/MACRO80と同等である。一般にマクロアセンブラは 単純な機械語命令変換のみのアセンブラと違って幾つかの機能を持っている。 このマクロ機能には通常のCPU命令である機械語と、擬似命令と呼ぶアセンブラ処理系に対する 機能が追加されている。擬似命令はCPU命令ではなくアセンブラが読み取り処理する特殊な識別子 といえる。 アセンブラに対する擬似命令はさまざまな種類の命令と機能を持っているが、このなかに マクロ機能と呼ぶものがある。 マクロ機能は単に幾つかの文字列を指定された文字列に変換する機能である。これらの実際の動作は 単純で、 "DCBA"という文字列がアセンブラのソース中に見つかった場合に、指定される文字列(...
  • シューマン波ジェネレータ
    PSGサンプル1 シューマン波ジェネレータ SONY HB-G900の存在が旧ソビエト連邦の宇宙実験施設ミールのコアモジュール内に見つけることが出来る という話が興味深かったので、宇宙で使われたコンピュータ繋がりで 長期滞在型宇宙船に搭載された奇妙な設備装置の話を目にしたので製作事例としてMSXで再現してみた。 HB-G900はミール宇宙船の居住施設コアモジュールに設置されていたらしいが詳細や用途は不明である。 今回再現するこの装置は地球固有の電磁気振動を再現するもので旧ソビエト連邦のミールではなく、 米国のアポロ宇宙計画から出てくる話で、宇宙空間で長期滞在が必要となる月着陸のアポロ宇宙計画のため に必要とされた機能らしい。 これらは1960年代の欧米のアポロ計画とスペースラブ計画などで使用したとか、されたらしい という噂程度のものであるが、実験的に使用してみると地上で...
  • z88dkを使ってみる
    z88dkを使う sdccのほかにz80向けクロス開発Cコンパイラとしてz88dkがある。 今回はz88dkを使ってみる。 MSXDOS向けソースのビルド z88dkはコンパイルオプション指定で様々な環境の実行形式を作成する。 MSXDOSの例としてCP/M向けのソースのコンパイル例を示す。 (MSXDOSはCPM互換なのでCPMオプションで可) c1.c main(void){ printf("hello"); } zcc +cpm c1.c -o c1.com z88dkは浮動小数点ライブラリが使える。浮動小数点はfloat,doubleが可能。 幾つかの三角関数なども使える。それらを使う場合はコンパイルオプションに-lmを追加する。 c2.c main(void){ double a=123.45;...
  • 古いCのK&R記述スタイルの違いについて
    古いCのK Rスタイルソースコードと現代の表記の違い C言語には幾つかの方言がある。C言語自体は1970年代から存在していたので利用例は多くあり、 DEC等に代表されるミニコンやホスト機、SunやHP,SGIの初期のワークステーション、 CP/Mなど8bit機械など古いシステムでも動作した。当時のC言語の処理系はソースコードの記法が 現代とは若干異なっている。 この原型となる処理系の表記については発明者で教科書の著者でもあるカーニハンとリッチさんが 書いたC言語の参考書にちなんでK R表記と呼ばれる。 1980年代初期のコンピュータで動作したC言語のソースはK R表記で書かれていることが殆どなので 8bitマシンに限定されたことではないので注意が必要である。 その後に1980年代終わり頃に標準化作業が行われ、現代利用されているC言語の表記が採用される ようになっ...
  • MSXDOS用putchar()標準ライブラリの修正
    sdccで自動的にリンクされるライブラリはデフォルトでビルドされているz80.lib。 このライブラリは書き換えたり修正する事が難しいので新しくライブラリを作る。 putchar()はアセンブリで書かれている。デフォルトではRST 08hが実行される。 putchar()はC言語でextern定義されている。 putchar() 関数の修正 putchar()を適切に書き換える。putchar()のソース修正箇は、 [drive \sdccdir]\lib\src\z80\putchar.sの以下の行をコメントアウトし 新しくアセンブラを追加する。 putchar.s _putchar _putchar_rr_s ; ld l,(hl) ; ld a,#1 ; rst 0x...
  • puts関数の修正
    標準Cライブラリソースのputs.cを別個に単体でコンパイル sdcc -mz80 -c puts.c MSXODS用に修正済みのputchar()のputchar.relを用意。 #include stdio.h void main(void){ puts("abc"); } sdcc -mz80 -c source.c sdld -b _DATA=0x100 -b _CODE=0x100 -i out.ihx source.rel putchar.rel puts.rel
  • 基本的なコンパイルの方法
    簡単なCソースを書く。ファイル名はsource.c void main(void){ } コマンド上からソースファイルをコンパイルする。 sdcc -mz80 source.c 以上が基本的なsdccのコンパイル。 ※コンパイル後に生成されるファイルは複数。*.asmはコンパイラが出力したアセンブルソース、*.relがリロケータブルオブジェクトファイル(通常は、*.objや、*.o、という名前が付くファイル)、 作成されるバイナリ形式は*.ihxとなる。 SDCCでコンパイルすると作成されるバイナリはIntelHEX形式のオブジェクトファイルが作成される。 IntelHEX形式は主にROM等を作成する際に用いられる形式で、バイナリがIntelHEX形式なのでそのままではMSXで動作しない。
  • 最適化オプション
    sdccのCコンパイラの最適化はデフォルトで有効化される。 部分的にオプションを指定することで最適化を無効化したり、有効化する。 sdcc -c -mz80 [optimizer option] source.c 基本的な最適化オプションは以下のとおり。 option 内容 --nogcse コード全体でsubexpressionを除去しない。これはCコード上に現われる部分式の共通部分について、最適化コードが短縮化することを避ける。対象はループなどに限らない。詳細は8.1.1に記載がある。 --noinvariant forループ構文条件下などで不変な部分式を検出しループ外に置き定数化する最適化を行なわない。詳細は8.1.4 --noinduction 同じくforループ構文中などのループインダクション最適化を行なわない。このオプションではループ条件下の配列インデ...
  • MSXDOS用のコンパイル方法
    MSXDOS用のコンパイル方法 sdccを使ってCソースをコンパイルする際は幾つか注意する点がある。 ROM用のバイナリを作るのか、MSXDOS用の実行形式、あるいはBASICのBLOAD形式のバイナリの 何れかの実行バイナリを作成するのかによりコンパイルオプションが異なる。 ここではMSXDOS上で動作する実行バイナリを例に説明する。 MSXDOS実行形式を前提とする場合、コンパイラのコマンドは以下となる。 (codeとdataを別アドレスに明示的に分離する場合は--data-loc 0x300など指定) sdcc --no-std-crt0 --code-loc 0x100 --data-loc 0x100 -mz80 source.c 次に作成されたIntelHEX形式(*.ihx)のファイルをバイナリ形式に変更する。 この時メモリーアドレ...
  • VDPステータスの取得
    ステータスを参照する主な目的はVDPコマンドの終了などのチェックである。 ステータスレジスタはR#15にステータスレジスタ番号をセットし、 0x99(Port-1)をリードすることで行なう。 ステータスのリードはI/Oポートの0x99(Port-1)をリードするので、 ステータス読み出しは二つのセクションに分かれる。 ステータスの取得は以下のような関数で実現可能だろう。 //CHECK VDP STSTUS unsigned char VStatus(unsigned char sreg){ unsigned char rtn; //R#15 VRegister(15,sreg); rtn=inp(0x99); //R#15 CLEAR VRegister(15,0); return(rtn); } ステータスを読む際に注意する点は、関数の...
  • 漢字モード切替コマンドを作る
    漢字モード 一部の2と2+以降のハードウエアでは漢字ディスプレイモードが利用できる。 漢字ドライバと呼ばれる機能はDOS/Vにおける漢字表示機能と同じ。 漢字モードでは日本語マルチバイト文字対応のCPM互換DOSとなる。 漢字ドライバはDOS/Vにおける英語モードから日本語モードへの切替に相当する。 (DOSコマンドでchevやjp/us等に該当) DOSファンクションコールも日本語対応のため、日本語に対応したCPM互換環境ともいえる。 漢字画面モードはグラフィクスモードに依存しており0-3までの4種類がある。 漢字ドライバはBASIC環境でCALL KANJI0命令実行後初期化される。 DOS2ではフロッピーブート領域に識別子が記録され起動時に初期化可能だが BASIC以外で初期化方法はない。BASIC命令で初期化が必要。 DOSコマンドで漢字モー...
  • DOSからBIOS機能を使う
    DOSからBIOS(API)の機能を使う例を示す。 DOSが起動中はZ80全ての物理アドレスは、スロットアドレス拡張によりRAMが選択されている。 DOS動作時にBIOS(API)機能を使いたい場合は、物理アドレスのページングを行ない、メモリー空間を切り替える必要がある。 通常は物理アドレスを直接切り替えるのではなく、インタースロットコール(内部スロットコール) を使い、特定のスロットの論理アドレスにある指定アドレスのAPIを呼び出す。 ここではBIOS(API)のCLS(0x00c3)機能をDOSから使う例を示す。 (DOS1にはCLSコマンドがないので、BIOSを使ってCLSを外部コマンドで作る) callcls.c extern void cls(void); void main(void){ cls(); } cls.asm ...
  • gets関数の追加
    ライブラリソースから[drive \sdccdir]\lib\src\gets.cファイルにあるgets()関数のCソースを編集しコンパイルする。 gets()関数はgetchar()を内部で利用する。 修正箇所はputchar()部分を全てコメントアウト。 システムコール0x01番は内部でエコーバックするため、gets()関数内部putchar()による エコーバック処理は必要無し。 gets.c #include stdio.h char * gets (char *s) { char c; unsigned int count = 0; while (1) { c = getchar (); switch(c) { case \b /* backspace */ ...
  • MAINROM又はSUBROMのあるスロットアドレスを得る
    MAINROM(通常はAPIやROMBASICインタプリタが記録されている)や SUBROM(2/2+以降の追加BIOS)は、Z80の物理アドレスを拡張したスロット と呼ばれる論理アドレスにマッピングされている。 このROMの場所を示すアドレスは、リニアなアドレス拡張ではないので スロットと呼ばれる形式でアドレス指定する必要がある。 (8086のセグメントベースレジスタのようなものと考えれば良い) つまり、0x8000など特定のアドレスを指定する場合は、MSXでは物理アドレスは拡張されているので正しくは、 [SLOT_POINTER(1,0)] [ADDRESS(0x8000)] という指定になる。 スロットアドレス指定は特殊なポインタであると考えると良い。 MAINROMとSUBROMのスロットアドレスは、起動時にROMBIOSファームウエアが...
  • TurboRのPCM機能
    TurboRのPCM機能は、8bitのAD/DAと15khzのサンプリング周波数をサポートする機能で オーディオ用途というよりはちょっとした遊びや実験機能として搭載されている。 専用ソフトはエコーや波形編集機能を持つので当時としては興味深かった。 プログラミング的な使い方はBIOSで提供された録音再生サブルーチンAPIを使う方法と、 直接DA/ADをコントロールする方法がある。 (拡張BASICでもPCM録音再生はサポートされていたがこれはBIOS APIを使っているようだ) PCM用BIOSサブルーチンは、PCMPLAY(0x0186)、PCMREC(0x0189)がMAIN ROMのエントリに新設された。 Aレジスタにサンプリング周波数指定、VRAM/MAINRAMエリア各種設定フラグを置いてコールする。 Aレジスタ内容 b7,b6,b5,b4,b3...
  • debug用関数を作る
    debug用関数を作る アセンブラやCを使っているとデバックがとても難しい。 そこでDOSデバッカがなくとも使える簡易型のデバック表示機能を作る。 使いかたはソースコード中でデバックしたい場所に関数を書いて実行すればよい。 Cプログラムなどからアセンブラなどを呼び出す場合のデバックに使うと便利だ。 DOS1/2だけでなくCPM汎用なので様々な機種で動作する。 この機能が呼ばれるとCPU状態をメモリに保存しデバック表示するとともに コンピュータの実行を停止する。 CPU状態の保存箇所はデフォルトでメモリアドレスの0xC000となる。MSX以外の ハードではアドレスを変えて使うことも可能だ。 アセンブラのソースコード部分を工夫すればsdcc以外でもビルドできるかもしれない。 stopdebug.asm ; _stopdebugtrace ...
  • floatについて
    普通に使って良いです。 #include float.h #include math.h void main(void){ float a; a=sqrtf(2); } sdcc -mz80 --code-loc 0x100 --data-loc 0x100 --no-std-crt0 source.c sdccの関数は通常のCライブラリ関数に対してfloatのfを追加した関数名となる。 通常のCで、sqrt()は、sqrtf()となる。同様にsin()はsinf()である。 floatの変数をprintf()で表示しないのであればこの方法で良い。 この時にリンクされるmath.hやfloat.h関連関数はz80.libで、コンパイラが特別にリンカ指定 しない際にデフォルトでリンクされるz80.libライブラリを参照する。 z8...
  • Z80割り込み処理について
    割り込みとはCPUが実行中に外部信号を受けて、実行中のプログラムから 一時的に割り込み処理プログラムを実行すること。 Z80の割り込み処理には大きく分けて2レベルの機能がある。 一つはソフトウエア的に割り込み処理を変更可能なINTと、 割り込みレベルが最も優先されるNMIである。 NMIは例えば電源が低下した時などあらゆる処理に優先されるような イベントをキャッチする際に用いられる。 通常の割り込み処理にはINTを使う。 2レベルの割り込みに加えてZ80のINT割り込みモードはさらに3つある。 モード0と呼ばれる割り込みは8080互換で、8080用の割り込みコントローラ 接続を前提としている。 このモードは複数の割り込みレベルを持ち、複数の割り込み信号をキャッチ できる。 割り込みされた場合、ジャンプ先は自動的にRST0h~RST38hなどのアド...
  • MSXDOS用標準ライブラリprintf関数の修正
    sdccはputs(),printf(),putchar()関数が存在する。 組み込み用途を前提としているためかgets(),getc(),scanf()などは実装されていない。 printfにはsmallとfastがある。これらは8051用で他のCPU用ではない。標準ではprintf_large.cを使うが、そのままではprintf_large.cはBool型の部分に問題があるのでソースを修正する。 #ifndef BOOL #define BOOL _Bool #endif printf_large.c上記項目を下記へ変更する。 #ifndef BOOL /* #define BOOL _Bool */ #define BOOL char #endif 次に自作ライブラリに必要なファイルをビルドする。 既にMSXDOSシステムコール対応修正済みのp...
  • ツール
    ツール類は Visual C++ 2008 Express Edition で作成 エラーチェックとか全然してないので、ソースごと晒してある ihx2bin ihx をバイナリ化する makemsxrom ihx2bin のサブセット ihx の 0x4000 ~ 0xBFFF までを切り出して 32k ROM イメージファイルを捏造する makedsk 2DD ディスクイメージ作成 中身が 0 で埋められた 720k バイトのバイナリファイルを捏造 writedsk ディスクイメージファイルに書き込み ディスクイメージファイルの任意のセクタに任意のバイナリファイルを書き込み 実はターゲットがディスクイメージである必要はない ihx2bin と組み合わせればメガロムも作れなくもない
  • MSXView用バイナリを作る
    MSXViewはマウス操作のGUI環境。 元々はHALNOTEと呼ぶものでありDOS2用に改良されたものでソフトは互換性があり HALNOTE用のアプリケーションはView環境でも動作するらしい。 MSXViewはシステムがROMに書かれておりアプリケーションはAPIを呼び出す事でGUI 機能を実行するらしい。 ソフト開発当初はアセンブラやLSIC-80が利用されたが後にMSX-Cなどでの開発が サポートされた。 必要なヘッダライブラリはDatapack TR版にありMSX-C用にはViewKITなどのファイルが配布 され開発用のツールがあった。 実行形式の基本的な仕様は一般的なCP/Mと同様に0x100番地からバイナリが配置される。 ただしView用のソフトはGUIなどを扱うのでコマンドでは動作しない。 アプリケーションの種類は拡張子で区別され、アイコ...
  • マクロアセンブラを使ったUTILS実装
    某所の資料テクニカルハンドブック に書かれているUTILS機能を持つアセンブラをマクロを用いて書いてみる。このマクロとアセンブラだけで DOSコマンド上で動くコマンドを作成できる。Cのライブラリを作成するときにも便利。Cとの違いに注意。 util.asm ;マクロを用いたutilsアセンブラルーチン群。 ; .area _ASMCODE ;DOSファンクションコールを用いて一文字出力する ;引数 chcode .macro putchar chcode pushaf pushbc push de pushhl lde,chcode;char code ldc,#0x02;function #02 call0x0005;function call pophl popde popbc popaf .endm ;数値を2桁16進に変換してDOS画面表示する ;引数 nu...
  • さまざまな乱数発生ルーチン
    ゲーム用プログラムやアプリで利用される乱数はゲーム内の遊びの面白さに直接関係する。 この乱数をどのように作成するかを考える。 sdccにはlong型があるので普通に標準関数のrand()関数を使うことは可能。ただし8bitのCPMやDOS用のC言語環境 などでは32bitのlong型を利用できないことがあるかもしれない。 ここで問題が発生する。なぜなら一般的なCの実装の乱数は32bit長の整数で計算するためlong型がないと計算できないため。 この場合にはsdccのC標準ライブラリではなく独自の乱数生成コードを使うことになる。 以下に比較的よく知られていて他でも紹介されているような有名な乱数ルーチンを示す。 Rレジスタ参照法 色々な所で紹介されているこの手法はZ80CPUの特徴であるDRAMリフレッシュカウンタを参照して乱数とする方法。 リフレッシュカウンタ...
  • I/O関数の追加
    sdccはinp(),outp()関数が無い。Z80用に関数を作成し追加する。 汎用性があるので他のZ80互換ハード用としても利用可能。 iolib.asm ;--------------- ;sdcc Z80 I/O function ;--------------- .area_CODE ; ; ret=inp(port addr) ; _inp ldhl,#2 addhl,sp ; ldc,(hl) ina,(c) ; ldl,a ldh,#0 ; ret ; ; outp(port addr,param) ; _outp push bc ldhl,#4 addhl,sp ; ldc,(hl) inchl ldb,(hl) out(c),b ; pop bc ret アセンブルしてオブジェクトファイルを作成。 sdasz80 -o iolib....
  • 日本語処理
    日本語漢字表示機能は2/2+以後に標準搭載されている。 Windowsが登場するはるか以前、ワープロ専用機が登場し利用されはじめるよりも昔、 1980年代ころにMSXは漢字機能を持つワープロとして利用されていたことがあった。 MSXはゲームやホビー用途が目的だったハードでありながら、漢字ワープロ機能を持つので、 日本語処理を持つコンピュータを意識した拡張設計が存在する。 MSXの漢字表示機能は、初期のハードウエアと後期のモデルでは実装される機能が若干異なる。 大きく分けて、3,4つのサブシステムに分かれる。 1,漢字ROMフォント 2,漢字変換IMEライブラリ 3,BASICやDOS上からIMEを利用するための仮想端末機能 4,英字BASICやDOSで漢字表示を可能にするスクリーンドライバ機能 このうち漢字フォントは初期のモデルからJIS第一水準、J...
  • マッパメモリ
    マッパRAM マッパRAMは、メモリ拡張のもう一つの仕組み。 マッパーと呼ばれる拡張はオプションのメモリRAM拡張の仕組み。マッパはRAMを拡張する。 ページセグメントの単位はスロットの仕組みと同じ16KB単位で似ているが、スロットとは異なる 実装である。 RAMの16KBページセグメント単位を自由自在に64KB物理アドレスに割り当てることができ、 メモリー空間を拡張する。 このマッパと呼ばれるメモリ拡張はRAMにのみ適用される(スロットはROM/RAM混載が可能) ページングの制御の仕方によってはリニアなメモリ拡張のように扱う事も可能。 マッパのページング単位はスロットと同じ16KB単位で64KB物理アドレス空間を4分割した 領域に対して外部拡張メモリをアドレスセレクトして割り当てる。 物理アドレス(16K単位)0 FFF...
  • V9990エミュレーション
    9990は幻と言われた9958の後継VDP。 従来のVDPと9990の基本的なVDP設計の違いは、9938/9958から導入された G4-G7ビットマップグラフィクスモードを引き継ぎ、画面モードや色数、 スプライト表示機能を改善したもの。 NESやファミリーコンピュータの画面モードと同じような画面モードである 9918互換のフォント・タイルビットマップG1,G2モードは9990では削除 されている。 (9918互換のタイル画面、アクセス方法を削除したものだが、 似たような画面モードはP1,P2モードとして9990にもある様子) 9990はVDPコマンドを引き継ぎ、同様の機能を持つ。 画面モードは同時発色数が増え、ビットマップのフィルなどピクセル動作も 9938/9958よりも速い。(およそ23倍高速) VRAM容量は9938/58は128KByte...
  • Moonsoundについて
    Moonsoundとは海外で作成された高音質サウンドカード。 ここではC言語から利用する場合の説明をする。 Moonsoundは拡張カートリッジとして作られており、音源はYAMAHA製のPCMサンプリング (16bitのwaveテーブル)とFM音源そしてPCM音源のデータセット(音のデータROM)を搭載している。 この音源に対しては、一部の海外製ゲームが対応していたり、音楽シーケンサーが作られた。 非常に良いサウンドを持つこのハードウエアには幾つかの互換性を持つクローンが存在する。 Moonsound自体は日本ではあまり有名ではなく、MIDI接続音源の方が一般的だった。 国内で多く流通してはいない。現在エミュレーション環境で再現することができる。 現在では幾つかのエミュレータにおいてMoonsoundの音源機能を再現しているので、そのステレオ サウンド音を体験...
  • VDP直接操作でテキスト画面に文字を出力する
    BIOSやDOSファンクションコールのCHPUTは遅いので 直接VDP操作しテキスト画面に文字を表示するほうが速い。 9918/9938/9958のテキスト画面モード機能は、VRAMにASCII文字コードを 書き込むと文字が画面に表示される。 この仕組みは現在市販されているキャラクタ型液晶表示モジュールと同じ。 テキスト画面に文字を表示させる場合は単にVRAMに文字を書き込めば良いが、 コンソールエミュレーションを行なう場合は改行処理を追加する必要がある。 そのほかVDPを直接操作する場合はBIOS処理と競合を避ける必要がある。 VDPを直接操作し単純に1文字をSCREEN0(40)テキスト画面に表示する例。 extern unsigned char inp(unsigned char); extern outp(unsigned char,unsi...
  • ファイル操作関数
    ファイル関連の機能は某所 でsdcc用のライブラリが公開されているが、そのままでは動かない。 なので必要なファイルを拾ってきて、適当に修正して使う事にする。 ここで作成するsdcc用のファイル操作関数は、MSXDOSで動作するもので、 ANSI-Cのファイル関数ではなく、DOSのシステムコールを呼び出すラッパとして 動作する。ANSI-Cに近い関数ライブラリのラッパを作る事も可能だろう。 まずヘッダをサルベージして適当に修正したものを使う。 dosfile.h typedef struct { unsigned chardrive_no; unsigned charname[8]; unsigned charext[3]; unsigned intcurrent_block; unsigned intrecord_size; unsigned long...
  • R800命令を追加する
    アセンブラであるsdasz80はZ80/64180の命令はサポートされているがR800はサポート されていないため独自に命令を追加する必要がある。 R800の追加命令をSDCCでサポートする場合はアセンブラsdasz80の コードにバイト命令を埋め込んで使うことになる。 命令を追加する場合は.dbディレクティブを使いアセンブラコードに追加された命令のバイナリビットを埋め込む。 この方法でsdasz80でサポートされていないさまざまなアーキテクチャの8080/Z80互換CPUの追加命令を埋め込むことが可能だ。 拡張命令(inc ixl)を使う例 ld ix,0x0 inc ixl ret アセンブラ未定義命令を埋め込む ld ix,0x0 .db 0xDD ;inc ixl .db 0x2C ret .dwディレクティブなどを使うと一行で書ける...
  • YM2413の音色の設定について
    PSG音源は、音の波形が矩形波をしており、いわゆる電圧の0/1のパルスを 周波数で駆動したものだ。 この音色はファミコンなどで聞き覚えのある音色となる。 FM音源の発音のメカニズムはPSGとは大きく異なる。 YM2413はLSIにあらかじめ組み込まれた音色が15個ある。複雑な音色を設定ず、 組み込まれた音色データを利用し、すぐに簡単に音を発音させる事ができる。 この組み込まれた音色データ以外に、一つだけオリジナルの音色を作る事も 可能だ。 オリジナルの音色を作る場合は、複雑なFM音源理論を理解してパラメータを操作する。 しかし音色レジスタは一つだけなので、LSI全体として一つだけ独自の音色が 設定できる。 9つあるチャンネル同時利用の際、オリジナル音色はただ一つだけ利用出来る。チャンネルごとに オリジナルの音色を個別に設定はできない。 また...
  • システムタイマー
    システムタイマー値を参照する方法は比較的簡単。 システムタイマーはハードウエアのVDP割り込み処理によって実現されており、 1/60secの間隔でVDPから投げられる割り込み信号を使いカウントする。 割り込み発生直後はBIOS内部の処理が呼ばれ、この内部でシステムタイマーのカウントが行なわれる。 ROMBASICにはシステムタイマーとしてTIME変数がある。 これは16bitの長さを持つアップカウンタで1/60Sec毎にカウントを行なう。 システムタイマーは約18分に一回ゼロクリアするアップカウンタで、数値が65535を超えるとクリアされゼロからカウントする。 このカウンタはBASICの変数と等しいので代入によりカウンタの初期値を決めることができる。 資料には書かれていない(誤記??)が、カウンタの値はシステムワークエリアの 0xFC9Eの2byteが使...
  • プラグイン/ニュース
    ニュース @wikiのwikiモードでは #news(興味のある単語) と入力することで、あるキーワードに関連するニュース一覧を表示することができます 詳しくはこちらをご覧ください。 =>http //atwiki.jp/guide/17_174_ja.html たとえば、#news(wiki)と入力すると以下のように表示されます。 【グランサガ】リセマラ当たりランキング - グランサガ攻略wiki - Gamerch(ゲーマチ) マニュアル作成に便利な「画像編集」機能を提供開始! - ナレッジ共有・社内wikiツール「NotePM」 (2021年12月6日) - エキサイトニュース マニュアル作成に便利な「画像編集」機能を提供開始! - ナレッジ共有・社内wikiツール「NotePM」 - PR TIMES 「Wiki」創設者のPC 競売に - ...
  • 16KB ROMイメージの作成
    ROMカートリッジ用ソフトをsdccでビルドする事は可能。 既に前任者によって書かれている内容もあるが、 完全に動作するものではないので、改めて説明する。 ここではsdccを使ってゲームアプリケーションを作る際のROMカートリッジ用のソフトを 作成する例を示す(基本的な情報は技術情報として広く知られている)。 ROMカートリッジは大きく分けて二種類あり、16/32KB容量のものと、 MEGAROMと呼ばれるタイプがある。 前者の小さな容量のROMカートリッジはスロットと呼ばれるメモリアドレス管理 のみ使うタイプなのでメモリ容量は小さい。 後者のメガROMはメモリアドレスの拡張が行なわれている。 今回は欲を出さず16KB容量のROMカートリッジ用のビルドを説明する。 この方法を使えば32KBも対応可能(テストはCBIOS Ver0.23で行なった) ...
  • Mathpack数値計算ライブラリについて
    Mathpackは数値計算を扱うライブラリ。このライブラリはMAINROMにあり殆どのハードウエアに ROMBASICと一緒に記録されている。 元々当時のマイクロソフト社BASICの機能が整数BASICのみであり、実数計算を実装する上で ライブラリとして実装したものらしく、 基本的には外部には公開されていないものだがユーザーが使う事もできる機能である。 この数値計算ライブラリはROMBIOSに含まれる機能で、sdccなどのC言語のMath.hに定義されるもの とは別である。 一般的な数値計算ライブラリがC関数として実装されているのに対し、これらの 数値計算ライブラリは今では珍しく仮想計算機として実装されている。 実装方法は浮動小数点演算を対象とした仮想計算機(VirtualMachine)そのものであり、 実数をレジスタにロードストアし、演算命令を実行するというも...
  • スロット
    スロット スロットと呼ばれる方式はメモリ拡張の仕組みでZ80b物理アドレス64KB空間を リニアに拡張するのではなく、16KBごとにページングされたアドレス領域を相互に切り替える事で アドレス空間の拡張と、外部外付けカートリッジへの対応を実現している。 Z80CPUの設計上は64Kbの物理アドレッシングを持つので、このメモリ空間を4つに分割し 16KB単位のページングを行なう。 詳細は、 MSX2 Technical Handbook 7章 スロットとカートリッジを参照。 スロットの16KB単位のページは他の64Kbメモリ空間と切り替える事でメモリを拡張するが、 その基本的なイメージを示す。 0 FFFF---------------|p0 |p1 |p2 |p3 |--------------- ...
  • Y8950
    Y8950のADPCMについて Y8950アプリケーションマニュアル Y8950はFM音源に加えて1チャンネルのADPCM録音再生機能を持っている。 FM音源とADPCM部分は別で、ADPCMの機能は、音声のサンプリング(録音)と再生、 可変速度再生。(この機能で音階を付けることは出来る) またその際の音声データはY8950が管理するメモリに記録される。 ADPCMのチャンネル数は1チャンネルのみ。 ADPCMデータの再生は、メモリ上の再生開始アドレスを指定し、サンプリング周波数を指定し 再生コマンドを実行する。 FM音源部分の信号はY8950外部のD/Aコンバータにデータをシリアル形式で出力する。 この時のフォーマットは13bitで、10bitデータ、3bit指数という形式で出力される。 このシリアルデータはY8950のMO端子から同期クロ...
  • sdccの割り込み処理関数
    C言語でコードを記述している際にCPUの割り込みを停止したい事がある。 割り込み機能を停止する際はCPU命令のDI/EIを使う。 sdccではインラインアセンブラが可能なので、割り込みを停止したいところでは DI/EIなどをインラインして部分的に割り込みを停止させる。 //INLINE __asm di __endasm; //....... //INLINE __asm ei __endasm; このインラインを用いる方法以外に、関数自体をクリティカル指定 する方法もある。 これらはsdccの拡張で、関数名に修飾子__CRITICALを追加する。 void function(void) __critical { //Interrupt critical section } クリティカル指定された関数は、関数の実行時には必ず割り込みが禁止され、 終...
  • 端末エミュレーションについて
    MSXBIOSやMSXDOSのファンクションコールがサポートする端末はTV52互換だったと思う。 ターミナルエミュレーションとしての互換性はVT52を基本としていて、Cのprintf()やputs() を使う場合は内部でファンクションコールを呼び出しており、それらはVT52互換となる。 C言語からは普通にVT52互換エスケープシーケンスを使える (VT100互換ではないからMSDOSと同じでない) #include stdio.h main(void){ printf("\033j"); //画面消去 } 端末エミュレーション互換性という意味では、世の中にはMSDOSなどのEDITコマンドやDOSSHELL、 UNIXではncursesなどで作成された「キャラクタユーザーインターフェース」がある。 これらと同等のライブラリは...
  • DOS2のマッパ拡張メモリ管理
    DOS2の拡張メモリ管理 DOS2環境には拡張メモリに関するBIOS(API)が用意されている。APIはROMBIOSとして 搭載されているのでDOS2環境では外付けカートリッジが必須。このAPIを使うことでDOS側で 拡張メモリのセグメント管理や切替が可能。独自のルーチンを作る必要はない。 DOS2のメモリ管理APIは基本的にDOS環境を前提としている。 拡張メモリ管理機能はDOS2のROMBIOSとして実装されている。既存のハードにDOS2拡張する場合は外付けカートリッジを搭載する。 初めからハードでDOS2環境が動作するTRなどは内部にBIOSROMが記録されている。 これらはDOS2が動作するハード環境にROMファームウエアAPIが搭載されているもので、 DOSファンクションコールとして実装されているわけではない。 DOS2の拡張メモリ管理APIはR...
  • Sleep関数を作る
    ウエイト処理などではforループを使うことも多いが、正確な時間で一時的に処理を止める ためにはCPU速度に依存しない正確な待ち時間処理が必要となる。 そこでシステムインターバルタイマを参照してsleep関数を作ってみる システムインターバルタイマーを使うと最小分解能1/60秒のsleep()関数を実装できる。 実装方法はシステムインターバルタイマーを参照し、初期化してから経過時間をチェックする。 システムタイマーは破壊的に変更されるが8bitマシンなので処理コストの小さな方法が有効。 新規に作成する関数はmsleep()という名前。一般的にはライブラリに存在する関数だが 環境によってはループ処理で代用されていたり実装されていない場合もある。 タイマーは環境依存するためANSI非互換だがラッパでsleep()を作ればANSI互換で時刻も正確に動作する。 引数は1...
  • MSXDOSのセルフ開発
    MSXDOSのC言語によるセルフ開発は問題があり、必ずDOS2を使うことが必要。 CコンパイラはCP/M用に開発されたものが大半であるが、 MSXDOS1はCP/M互換性を持つ一方で、完全互換というわけではないのでソフトウエアが動作 しなかったり、最悪の場合ファイルが破壊されたりする。 典型的な問題を生じるのがCP/M用のCコンパイラ。Cコンパイラはバッチで動いていたり、 コードチェックなどで外部コマンドが頻繁に呼ばれて実行されたりする。 多くのファイルを同時にオープンしたりするので、CP/M用のCコンパイラをMSXDOS1上で ファイル読み書きしているとファイルが消えるなどの問題が生じる。 (CP/Mと違いMSXDOS1はメモリ配置が若干異なり、FATアロケーションのバッファが破壊される 為にファイルが消えるのかもしれないが、詳しくは判らない) DO...
  • VSYNC割り込み処理をCで記述する
    ROMBASICにはインターバルタイマーを利用したタイマー割り込み処理がある。 これは便利な機能だが、C言語で同様な処理を行なわせる場合、タイマー割り込みのフック (ジャンプテーブル)を書き換え、自前の割り込み処理関数をコールバックの形で呼び出す 仕組みにすればよい。 割り込み処理のフックから、C言語の割り込み処理関数をコールするように変更する場合は 若干工夫が必要になる。 実際の割り込みが生じた場合の処理フローは、 (Z80 Interupt) - BIOS(0x0-0x3FFF) - HOOK(0xFD9F) - DISKCALL(RST30h) - RET ここを自前の関数で置き換える必要がある。 (Z80 Interupt) - BIOS(0x0-0x3FFF) - HOOK(0xFD9F) - VSYNC_Int( ...
  • VDPアクセス例
    既に作成したinp(),outp()I/O関数を用いてVDPを直接扱う。 VDPを直接設定し画面モードを切り替える場合は、BIOSと異なりレジスタの操作と画面初期化 などを必要とする。 新たに作成した関数はVDPレジスタアクセス、メモリーアドレス設定、フォント再設定の 三つの関数のみ。 VRAMへのアクセス方法は初めにアドレス(VMemadr)をセットし、後はI/Oダイレクト(outp/inp)に連続してリードライトする。 SCREEN8へ切り替えはVDPモードレジスタの設定だけでなく、CLS処理など 画面の初期化を行なう必要がある。 SCREEN8からテキストモードSCREEN0へ復帰する際は、9938/9958のフォントデータを 再セットアップする必要がある。 以下のサンプルコードは英数字のみ。 サンプル例はSCREEN0(W...
  • メニュー
    メニュー トップページ インストール 基本 コンパイルオプション グローバル変数初期化コード 静的なテーブル 割り算と掛け算 as-z80 での関数記述 アセンブラの相違点 32k ROM の作成 ディスク起動ソフトの作成 実行とデバッグ ツール 基本的なコンパイルの方法 MSXDOS用のコンパイル方法 putchar関数の修正 puts関数の修正 printf関数の修正 getchar関数の追加 gets関数の追加 I/O関数の追加 最適化オプション floatについて ファイル操作関数 sdccの割り込み処理関数 16KB ROMイメージの作成 Moonsoundについて Mathpack数値計算ライブラリについて 端末エミュレーションについて VSYNC割り込み処理をCで記述する DOSからBIOS機能を使う MAINROM又はSUBROMのあるスロットアドレスを得る 漢字ROMから...
  • 32k ROM の crt0.s
    32k ROM イメージ用 crt0.s サンプル 各種デバイスの初期化をしません そのためディスクドライブも使用できません ROM ヘッダ部分 カートリッジロムヘッダと 0x4010 からの初期化コードエントリポイントなどの設定 ;; crt0.s for msx rom .module crt0 .globl_main .area _HEADER (ABS) ;; rom header .org0x4000 .db0x41, 0x42; id .dwinit; init .dw0x0000; statement .dw0x0000; device .dw0x0000; text .dw0x0000; reserve .dw0x0000; reserve .dw0x0000; reserve ここから main() に入る前の初期化 スタック設定とページ...
  • プラグイン
    @wikiにはいくつかの便利なプラグインがあります。 アーカイブ コメント ニュース 動画(Youtube) 編集履歴 関連ブログ これ以外のプラグインについては@wikiガイドをご覧ください = http //atwiki.jp/guide/
  • @wiki全体から「ソースの動作確認」で調べる

更新順にページ一覧表示 | 作成順にページ一覧表示 | ページ名順にページ一覧表示 | wiki内検索

ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。