msx-sdcc @ ウィキ内検索 / 「16KB ROMイメージの作成」で検索した結果

検索 :
  • 16KB ROMイメージの作成
    ... 今回は欲を出さず16KB容量のROMカートリッジ用のビルドを説明する。 この方法を使えば32KBも対応可能(テストはCBIOS Ver0.23で行なった) ROMカートリッジは本体のスロット1/2に接続するが、ページ0と3は システムで予約されているので使う事が出来ない。 ページ0はMAIN BIOS、ページ3はRAM(workarea)が使用している。 その結果ページ1,2に外部ROMが接続される形となり、最大で32KBの容量となる。 これが基本的なメモリマップとなる。 (メガROMの場合は32KB分のページを外部メモリと切り替えて使う事になるようだが詳細は判らない) ROMから起動するために必要なことは、ROMに書き込むヘッダコード。 以下に簡単なアセンブラの初期化コードを示す。 start.asm ; ;CARTRIDGE HEAD...
  • メニュー
    ...の割り込み処理関数 16KB ROMイメージの作成 Moonsoundについて Mathpack数値計算ライブラリについて 端末エミュレーションについて VSYNC割り込み処理をCで記述する DOSからBIOS機能を使う MAINROM又はSUBROMのあるスロットアドレスを得る 漢字ROMからフォントデータを読み出す システムタイマー MSXDOSのセルフ開発 日本語処理 DOS2のマッパ拡張メモリ管理 スロット マッパメモリ V9990エミュレーション VDPステータスの取得 VDPアクセス例 VDP直接操作でテキスト画面に文字を出力する Y8950 YM2413の音色の設定について YM2413FM音源の使い方 AY-3-8910PSGサウンドの使い方 ジョイスティックやパッドのチェック sdccの割り込み処理関数 TurboRのPCM機能 z88dkを使ってみる Sleep関...
  • スロット
    ...拡張するのではなく、16KBごとにページングされたアドレス領域を相互に切り替える事で アドレス空間の拡張と、外部外付けカートリッジへの対応を実現している。 Z80CPUの設計上は64Kbの物理アドレッシングを持つので、このメモリ空間を4つに分割し 16KB単位のページングを行なう。 詳細は、 MSX2 Technical Handbook 7章 スロットとカートリッジを参照。 スロットの16KB単位のページは他の64Kbメモリ空間と切り替える事でメモリを拡張するが、 その基本的なイメージを示す。 0 FFFF---------------|p0 |p1 |p2 |p3 |--------------- p0=0x0 p1=0x4000 p2=0x8000 p3=0xFFFF CPUの...
  • シューマン波ジェネレータ
    ...する必要がある。 16KB,ROMなので開始アドレスは0x4000から始まる。hex2bin以外を使用し作成されるバイナリが 0x0-0x3FFFを含む場合はバイナリエディタで削除すること。 アセンブル手順は以下の通り。 sdasz80 -o file.rel file.asm sdld -i file.ihx file.rel hex2bin file.ihx copy file.bin file.rom ;Simple schuman wave pulse generator (audio output ; connects tocoil) ;***16KB ROM Cartridge .area _ASM (abs,con) .org0x4000 ;-----ROM Header .dw"AB" .dw0x4050 .dw0,0,0...
  • 実行とデバッグ
    終了待ちしない VDP コマンドの実行結果とかが妙にリアルな blueMSX で実行/デバッグする 実行は普通に ROM イメージ/ディスクイメージ で読み込むだけ デバッグは blueMSX のデバッガ機能を使う map と asm を出力して、blueMSX のデバッガとにらめっこしながらデバッグする 死にかける 実機の場合は ROM イメージを 16k x2 に分割して、32k ROM イメージのランチャとかで実行 ROM 焼ける人は詳しくは知らんけど ihx のまま焼けるんじゃないの? ディスクイメージはそのままディスク作ってドライブに入れるだけ 1 chip だと似非RAMモードでメガロムとかも実行できると思われ
  • ディスク起動時のブートセクタ
    適当ブートセクタ ディスク情報は無意味にアレスタ2からコピペ なので適当に変更すること ちなみに DOS2 フォーマットにしてあるので turboR で起動すると R800 モードになる コード自体はブート時に読み込まれる 0xC000 から始まる 256 バイトのアレ 2回呼ばれ、 初回は ret nc のとこで何もせずにリターン 2回目は de にページ 1 を DISK ROM へ切り替えるコードのアドレス hl にページ 1 を RAM へ切り替えるコードのアドレスが入ってコールされる で、そのアドレスへのコールを BASIC のファンクションキーの文字列を入れとくワークに適当にコピる なのでこれ以降 call0xf87f で、ページ1がディスクROMに call0xf87f+4 で、ページ1が RAM にな...
  • マッパメモリ
    ...ロットの仕組みと同じ16KB単位で似ているが、スロットとは異なる 実装である。 RAMの16KBページセグメント単位を自由自在に64KB物理アドレスに割り当てることができ、 メモリー空間を拡張する。 このマッパと呼ばれるメモリ拡張はRAMにのみ適用される(スロットはROM/RAM混載が可能) ページングの制御の仕方によってはリニアなメモリ拡張のように扱う事も可能。 マッパのページング単位はスロットと同じ16KB単位で64KB物理アドレス空間を4分割した 領域に対して外部拡張メモリをアドレスセレクトして割り当てる。 物理アドレス(16K単位)0 FFFF---------------|A |B |C |D |E--------------- | | | |----------------------...
  • Mathpack数値計算ライブラリについて
    ...-0x3FFFの 16KB以内に収まっている。その機能のうち数値型変換の幾つかはROMBASICがないと動作しない。 仮想計算機の実数レジスタはワークエリアRAM(0xF380-0xFFFF)に置かれている。 実数レジスタはDAC,ARGという二つのレジスタがある。実数計算はこれらのレジスタが中心となる。 実数レジスタの変数領域はRAM(ワークエリア)上に確保されており、数値はワークエリアのメモリに 直接値をロードストアしたり、仮想計算機の命令(BIOSのAPIとして実装)でロード可能。 MathpackのAPIには実数を対象とした加減乗除のほか、平方根、三角関数、数値レジスタへの ロードストア、そして変数のタイプ変換機能などがある。 しかし数値変換機能など一部の機能はBASICコードを呼び出し利用しているらしくMathpack本体が 保存されているMAINR...
  • DOS2のマッパ拡張メモリ管理
    ...イト単位ではなく 16KBのセグメント単位である。 またセグメントのmallocはユーザー/システムセグメントを区別でき、複数のマッパ拡張メモリが 搭載されている場合は未使用のセカンダリ拡張メモリマッパ(通常は異なる別スロットにある)も アロケート対象とすることができる。 アセンブラとして呼ぶ事も出来るが(APIはアセンブラ利用を想定している)利用方法はBIOSのAPIを 直接コールするのではなくCの関数としてAPIをラップするほうが便利。 基本的な使用法は初めに必要なメモリブロックをヒープからアロケートし、使い終わったら freeで開放する。セグメントの管理はAPIに任せられるが、一定のセグメントブロックをアプリ側で 使っている場合はセグメント番号はアプリ側で持っておく必要はある。 (malloc/freeのようにメモリポインタを保持するようにfree対象...
  • 漢字ROMからフォントデータを読み出す
    漢字フォントROMはI/Oポートの0xD8-0xDBに接続されている。 漢字フォントは16x16ドットのフォントデータを持っている。 このフォントROMは漢字の使用頻度によって第一水準、第二水準という区分があり、 第一水準の漢字フォントをリードする場合は、0xD8,0xD9にアドレスを出力する。 第二水準漢字フォントをリードする場合は0xDA,0xDBにアドレスを出力する。 データの読み出しは第一水準の場合、アドレス送出後、0xD9を32回リードする。 第二水準の場合はアドレス送出後、0xDBを32回リードして16x16フォントデータを得る。 漢字ROMフォントへアドレス出力する場合は2byteを必要とするが、この時のアドレスは 区点コード(漢字フォント格納形式)という特殊な形式で扱う必要がある。 直接文字コードであるSJISコードを出力して漢字フォント...
  • コンパイルオプション
    [input.c/input.o] 入力ファイル 書いた順でリンクされる で、いちばん最初に書かれているファイルの最初に書かれている関数が main() になってしまう なんかやれば回避できると思うけど調べるのめんどくせ -o [output.ihx] 出力ファイル名 出力する ihx ファイルを指定 -mz80 Z80 のコードを吐く --no-std-crt0 標準の crt0 (要は main() に来る前に動かすコード)を使用しない sdcc の crt0 使ったところで MSX 用じゃないので動かない --nostdinc 標準インクルードファイルを無視 これも意味ないので無視 --nostdlib 標準ライブラリを無視 これも意味ないので無視 --code-loc 0x4020 コードの格納開始位置を指定する 0x4020 にしてるのは ROM 化して crt0.s で 0x4...
  • 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...
  • マシンステータスを得る
    マシンステータスを得る ROMやシステム領域を参照してメモリサイズやマシンのバージョンを得ることが可能。 DOSから現在実行中のマシンの種類を得るコマンドmstatを作ってみる。 いろいろ工夫することでもっと多くのマシン状態を表示する事も可能だ。 mstat.c #include stdio.h extern unsigned char rom_version(); void main(void){ unsigned int *SZ_VRAM=(unsigned int*)0xFAFC; unsigned int *SZ_DISK=(unsigned int*)0xFFA7; unsigned char ver; unsigned char vmem; printf("--- mstat \r\n"); //VRAM printf(&...
  • 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;...
  • Moonsoundについて
    Moonsoundとは海外で作成された高音質サウンドカード。 ここではC言語から利用する場合の説明をする。 Moonsoundは拡張カートリッジとして作られており、音源はYAMAHA製のPCMサンプリング (16bitのwaveテーブル)とFM音源そしてPCM音源のデータセット(音のデータROM)を搭載している。 この音源に対しては、一部の海外製ゲームが対応していたり、音楽シーケンサーが作られた。 非常に良いサウンドを持つこのハードウエアには幾つかの互換性を持つクローンが存在する。 Moonsound自体は日本ではあまり有名ではなく、MIDI接続音源の方が一般的だった。 国内で多く流通してはいない。現在エミュレーション環境で再現することができる。 現在では幾つかのエミュレータにおいてMoonsoundの音源機能を再現しているので、そのステレオ サウンド音を体験...
  • 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)のファイルをバイナリ形式に変更する。 この時メモリーアドレ...
  • 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などを扱うのでコマンドでは動作しない。 アプリケーションの種類は拡張子で区別され、アイコ...
  • システムタイマー
    システムタイマー値を参照する方法は比較的簡単。 システムタイマーはハードウエアのVDP割り込み処理によって実現されており、 1/60secの間隔でVDPから投げられる割り込み信号を使いカウントする。 割り込み発生直後はBIOS内部の処理が呼ばれ、この内部でシステムタイマーのカウントが行なわれる。 ROMBASICにはシステムタイマーとしてTIME変数がある。 これは16bitの長さを持つアップカウンタで1/60Sec毎にカウントを行なう。 システムタイマーは約18分に一回ゼロクリアするアップカウンタで、数値が65535を超えるとクリアされゼロからカウントする。 このカウンタはBASICの変数と等しいので代入によりカウンタの初期値を決めることができる。 資料には書かれていない(誤記??)が、カウンタの値はシステムワークエリアの 0xFC9Eの2byteが使...
  • さまざまな乱数発生ルーチン
    ゲーム用プログラムやアプリで利用される乱数はゲーム内の遊びの面白さに直接関係する。 この乱数をどのように作成するかを考える。 sdccにはlong型があるので普通に標準関数のrand()関数を使うことは可能。ただし8bitのCPMやDOS用のC言語環境 などでは32bitのlong型を利用できないことがあるかもしれない。 ここで問題が発生する。なぜなら一般的なCの実装の乱数は32bit長の整数で計算するためlong型がないと計算できないため。 この場合にはsdccのC標準ライブラリではなく独自の乱数生成コードを使うことになる。 以下に比較的よく知られていて他でも紹介されているような有名な乱数ルーチンを示す。 Rレジスタ参照法 色々な所で紹介されているこの手法はZ80CPUの特徴であるDRAMリフレッシュカウンタを参照して乱数とする方法。 リフレッシュカウンタ...
  • AY-3-8910PSGサウンドの使い方
    AY-3-8910はPSGサウンドを再生するチップで比較的良く知られており、 数多くの機器に搭載されたサウンドデバイスである。 PSGはパルス波形を基本とした音で、同時発音数は3チャンネル、 このほかにノイズジェネレータ機能を含む。 単純なビープ音を発するのであれば最新のチップでは専用のLSIを用いずとも 可能だが、正確な音階やメロディー、和音を再現する場合は既存の機能では 不十分の場合があり、現在でもAY-3-8910などと互換性を持つ設計が用いられる事がある。 AY-3-8910I/Oアドレス 0xA0 Register number 0xA1 Write 0xA2 Read AY-3-8910のレジスタは16個。音を発生させる場合は、3つあるチャンネルから、 各チャンネルの周波数と音量を設定するだけ。 音量をセットすると即座に音が発音する。...
  • マクロアセンブラを使った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用のライブラリが公開されているが、そのままでは動かない。 なので必要なファイルを拾ってきて、適当に修正して使う事にする。 ここで作成する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...
  • debug用関数を作る
    debug用関数を作る アセンブラやCを使っているとデバックがとても難しい。 そこでDOSデバッカがなくとも使える簡易型のデバック表示機能を作る。 使いかたはソースコード中でデバックしたい場所に関数を書いて実行すればよい。 Cプログラムなどからアセンブラなどを呼び出す場合のデバックに使うと便利だ。 DOS1/2だけでなくCPM汎用なので様々な機種で動作する。 この機能が呼ばれるとCPU状態をメモリに保存しデバック表示するとともに コンピュータの実行を停止する。 CPU状態の保存箇所はデフォルトでメモリアドレスの0xC000となる。MSX以外の ハードではアドレスを変えて使うことも可能だ。 アセンブラのソースコード部分を工夫すればsdcc以外でもビルドできるかもしれない。 stopdebug.asm ; _stopdebugtrace ...
  • sdasのマクロアセンブラ機能について
    マクロアセンブラ機能 sdccに付属するZ80のアセンブラにはマクロ機能が追加されている。 このマクロ機能はマイクロソフトのM80/MACRO80と同等である。一般にマクロアセンブラは 単純な機械語命令変換のみのアセンブラと違って幾つかの機能を持っている。 このマクロ機能には通常のCPU命令である機械語と、擬似命令と呼ぶアセンブラ処理系に対する 機能が追加されている。擬似命令はCPU命令ではなくアセンブラが読み取り処理する特殊な識別子 といえる。 アセンブラに対する擬似命令はさまざまな種類の命令と機能を持っているが、このなかに マクロ機能と呼ぶものがある。 マクロ機能は単に幾つかの文字列を指定された文字列に変換する機能である。これらの実際の動作は 単純で、 "DCBA"という文字列がアセンブラのソース中に見つかった場合に、指定される文字列(...
  • Sleep関数を作る
    ウエイト処理などではforループを使うことも多いが、正確な時間で一時的に処理を止める ためにはCPU速度に依存しない正確な待ち時間処理が必要となる。 そこでシステムインターバルタイマを参照してsleep関数を作ってみる システムインターバルタイマーを使うと最小分解能1/60秒のsleep()関数を実装できる。 実装方法はシステムインターバルタイマーを参照し、初期化してから経過時間をチェックする。 システムタイマーは破壊的に変更されるが8bitマシンなので処理コストの小さな方法が有効。 新規に作成する関数はmsleep()という名前。一般的にはライブラリに存在する関数だが 環境によってはループ処理で代用されていたり実装されていない場合もある。 タイマーは環境依存するためANSI非互換だがラッパでsleep()を作ればANSI互換で時刻も正確に動作する。 引数は1...
  • 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ディレクティブなどを使うと一行で書ける...
  • 最適化オプション
    sdccのCコンパイラの最適化はデフォルトで有効化される。 部分的にオプションを指定することで最適化を無効化したり、有効化する。 sdcc -c -mz80 [optimizer option] source.c 基本的な最適化オプションは以下のとおり。 option 内容 --nogcse コード全体でsubexpressionを除去しない。これはCコード上に現われる部分式の共通部分について、最適化コードが短縮化することを避ける。対象はループなどに限らない。詳細は8.1.1に記載がある。 --noinvariant forループ構文条件下などで不変な部分式を検出しループ外に置き定数化する最適化を行なわない。詳細は8.1.4 --noinduction 同じくforループ構文中などのループインダクション最適化を行なわない。このオプションではループ条件下の配列インデ...
  • @wiki全体から「16KB ROMイメージの作成」で調べる

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

ツールボックス

下から選んでください:

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