msx-sdcc @ ウィキ内検索 / 「MSXDOS用putchar()標準ライブラリの修正」で検索した結果

検索 :
  • 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...
  • 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...
  • 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)のファイルをバイナリ形式に変更する。 この時メモリーアドレ...
  • MSXDOSのセルフ開発
    MSXDOSのC言語によるセルフ開発は問題があり、必ずDOS2を使うことが必要。 CコンパイラはCP/M用に開発されたものが大半であるが、 MSXDOS1はCP/M互換性を持つ一方で、完全互換というわけではないのでソフトウエアが動作 しなかったり、最悪の場合ファイルが破壊されたりする。 典型的な問題を生じるのがCP/M用のCコンパイラ。Cコンパイラはバッチで動いていたり、 コードチェックなどで外部コマンドが頻繁に呼ばれて実行されたりする。 多くのファイルを同時にオープンしたりするので、CP/M用のCコンパイラをMSXDOS1上で ファイル読み書きしているとファイルが消えるなどの問題が生じる。 (CP/Mと違いMSXDOS1はメモリ配置が若干異なり、FATアロケーションのバッファが破壊される 為にファイルが消えるのかもしれないが、詳しくは判らない) DO...
  • 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 */ ...
  • 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
  • メニュー
    メニュー トップページ インストール 基本 コンパイルオプション グローバル変数初期化コード 静的なテーブル 割り算と掛け算 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から...
  • 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...
  • 古い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言語の表記が採用される ようになっ...
  • Mathpack数値計算ライブラリについて
    Mathpackは数値計算を扱うライブラリ。このライブラリはMAINROMにあり殆どのハードウエアに ROMBASICと一緒に記録されている。 元々当時のマイクロソフト社BASICの機能が整数BASICのみであり、実数計算を実装する上で ライブラリとして実装したものらしく、 基本的には外部には公開されていないものだがユーザーが使う事もできる機能である。 この数値計算ライブラリはROMBIOSに含まれる機能で、sdccなどのC言語のMath.hに定義されるもの とは別である。 一般的な数値計算ライブラリがC関数として実装されているのに対し、これらの 数値計算ライブラリは今では珍しく仮想計算機として実装されている。 実装方法は浮動小数点演算を対象とした仮想計算機(VirtualMachine)そのものであり、 実数をレジスタにロードストアし、演算命令を実行するというも...
  • 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;...
  • 16KB ROMイメージの作成
    ROMカートリッジ用ソフトをsdccでビルドする事は可能。 既に前任者によって書かれている内容もあるが、 完全に動作するものではないので、改めて説明する。 ここではsdccを使ってゲームアプリケーションを作る際のROMカートリッジ用のソフトを 作成する例を示す(基本的な情報は技術情報として広く知られている)。 ROMカートリッジは大きく分けて二種類あり、16/32KB容量のものと、 MEGAROMと呼ばれるタイプがある。 前者の小さな容量のROMカートリッジはスロットと呼ばれるメモリアドレス管理 のみ使うタイプなのでメモリ容量は小さい。 後者のメガROMはメモリアドレスの拡張が行なわれている。 今回は欲を出さず16KB容量のROMカートリッジ用のビルドを説明する。 この方法を使えば32KBも対応可能(テストはCBIOS Ver0.23で行なった) ...
  • ファイル操作関数
    ファイル関連の機能は某所 で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...
  • コンパイルオプション
    [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...
  • getchar関数の追加
    sdccにはgetchar(),gets(),scanf()などの関数は無いがgetchar()関数プロトタイプはstdio.hに有る。 そこでアセンブラで関数を追加し、getchar()を実装する。 新規にgetchar.asmを作成する。 ; ;getchar.asm ; .area_CODE ; _getchar ldc,#1 call0x05 ; ret getchar()はシステムコールの0x01番を利用する。 このファイルをアセンブルしオブジェクトを作成する。 アセンブルは↓ sdasz80 -o getchar.rel getchar.asm C言語の利用 getchar()はstdio.hにヘッダが記載されているのでそのまま利用可能。 #include stdio.h void main(void){ char ...
  • 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直接操作でテキスト画面に文字を出力する
    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...
  • 端末エミュレーションについて
    MSXBIOSやMSXDOSのファンクションコールがサポートする端末はTV52互換だったと思う。 ターミナルエミュレーションとしての互換性はVT52を基本としていて、Cのprintf()やputs() を使う場合は内部でファンクションコールを呼び出しており、それらはVT52互換となる。 C言語からは普通にVT52互換エスケープシーケンスを使える (VT100互換ではないからMSDOSと同じでない) #include stdio.h main(void){ printf("\033j"); //画面消去 } 端末エミュレーション互換性という意味では、世の中にはMSDOSなどのEDITコマンドやDOSSHELL、 UNIXではncursesなどで作成された「キャラクタユーザーインターフェース」がある。 これらと同等のライブラリは...
  • 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....
  • さまざまな乱数発生ルーチン
    ゲーム用プログラムやアプリで利用される乱数はゲーム内の遊びの面白さに直接関係する。 この乱数をどのように作成するかを考える。 sdccにはlong型があるので普通に標準関数のrand()関数を使うことは可能。ただし8bitのCPMやDOS用のC言語環境 などでは32bitのlong型を利用できないことがあるかもしれない。 ここで問題が発生する。なぜなら一般的なCの実装の乱数は32bit長の整数で計算するためlong型がないと計算できないため。 この場合にはsdccのC標準ライブラリではなく独自の乱数生成コードを使うことになる。 以下に比較的よく知られていて他でも紹介されているような有名な乱数ルーチンを示す。 Rレジスタ参照法 色々な所で紹介されているこの手法はZ80CPUの特徴であるDRAMリフレッシュカウンタを参照して乱数とする方法。 リフレッシュカウンタ...
  • マクロアセンブラを使った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...
  • 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...
  • マッパメモリ
    マッパRAM マッパRAMは、メモリ拡張のもう一つの仕組み。 マッパーと呼ばれる拡張はオプションのメモリRAM拡張の仕組み。マッパはRAMを拡張する。 ページセグメントの単位はスロットの仕組みと同じ16KB単位で似ているが、スロットとは異なる 実装である。 RAMの16KBページセグメント単位を自由自在に64KB物理アドレスに割り当てることができ、 メモリー空間を拡張する。 このマッパと呼ばれるメモリ拡張はRAMにのみ適用される(スロットはROM/RAM混載が可能) ページングの制御の仕方によってはリニアなメモリ拡張のように扱う事も可能。 マッパのページング単位はスロットと同じ16KB単位で64KB物理アドレス空間を4分割した 領域に対して外部拡張メモリをアドレスセレクトして割り当てる。 物理アドレス(16K単位)0 FFF...
  • ソースの動作確認
    SDCCでコンパイルしたソースコードをその場でチェックする方法があると便利。 CP/Mエミュレータを利用すれば、コンパイルしたバイナリをその場で動作確認可能。 CP/Mエミュレータは以下からダウンロードできる。 このエミュレーターはWindowsコマンドプロンプト環境で動作するので、 コンパイル後の動作チェックに向いている。 CP/M Player for Win32 ※このエミュレータは全てのCP/Mファンクションコールを再現していないので注意。 またMSXDOS用でもないので、完全なエミュレーションは期待できない。 コンソール動作もやや怪しいが簡単な動作確認は可能だろう。
  • 最適化オプション
    sdccのCコンパイラの最適化はデフォルトで有効化される。 部分的にオプションを指定することで最適化を無効化したり、有効化する。 sdcc -c -mz80 [optimizer option] source.c 基本的な最適化オプションは以下のとおり。 option 内容 --nogcse コード全体でsubexpressionを除去しない。これはCコード上に現われる部分式の共通部分について、最適化コードが短縮化することを避ける。対象はループなどに限らない。詳細は8.1.1に記載がある。 --noinvariant forループ構文条件下などで不変な部分式を検出しループ外に置き定数化する最適化を行なわない。詳細は8.1.4 --noinduction 同じくforループ構文中などのループインダクション最適化を行なわない。このオプションではループ条件下の配列インデ...
  • 基本
    BASIC よりは速いが、アセンブラで書くよりは圧倒的に遅い 雰囲気的には BASIC + アセンブラで書いたときの BASIC 部分の置き換えだと思った方が良い それでも BASIC コンパイラくらいの速度は出てると思われ Cの標準ライブラリは使えないので、使いたければ自分で書く 割り算と掛け算も使えないので、自分で書く、もしくは sdcc のライブラリからコピペ crt0.s も自分で書く グローバル変数の初期化コードは ROM 化した場合、RAM 領域に置かれる メガロム/ディスクイメージ作成時の関数オーバーレイはめんどいので、関数をアドレス指定で生成するか、データだけ読み替えることにして諦める Z80 はレジスタ足りないし、アドレッシングモードが全然 C 向けじゃないので、 そもそもC言語に適さない それでも C でパフォーマンスを出すには -オブジェクト指向は忘れる -ローカル変...
  • 日本語処理
    日本語漢字表示機能は2/2+以後に標準搭載されている。 Windowsが登場するはるか以前、ワープロ専用機が登場し利用されはじめるよりも昔、 1980年代ころにMSXは漢字機能を持つワープロとして利用されていたことがあった。 MSXはゲームやホビー用途が目的だったハードでありながら、漢字ワープロ機能を持つので、 日本語処理を持つコンピュータを意識した拡張設計が存在する。 MSXの漢字表示機能は、初期のハードウエアと後期のモデルでは実装される機能が若干異なる。 大きく分けて、3,4つのサブシステムに分かれる。 1,漢字ROMフォント 2,漢字変換IMEライブラリ 3,BASICやDOS上からIMEを利用するための仮想端末機能 4,英字BASICやDOSで漢字表示を可能にするスクリーンドライバ機能 このうち漢字フォントは初期のモデルからJIS第一水準、J...
  • debug用関数を作る
    debug用関数を作る アセンブラやCを使っているとデバックがとても難しい。 そこでDOSデバッカがなくとも使える簡易型のデバック表示機能を作る。 使いかたはソースコード中でデバックしたい場所に関数を書いて実行すればよい。 Cプログラムなどからアセンブラなどを呼び出す場合のデバックに使うと便利だ。 DOS1/2だけでなくCPM汎用なので様々な機種で動作する。 この機能が呼ばれるとCPU状態をメモリに保存しデバック表示するとともに コンピュータの実行を停止する。 CPU状態の保存箇所はデフォルトでメモリアドレスの0xC000となる。MSX以外の ハードではアドレスを変えて使うことも可能だ。 アセンブラのソースコード部分を工夫すればsdcc以外でもビルドできるかもしれない。 stopdebug.asm ; _stopdebugtrace ...
  • 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 ...
  • シューマン波ジェネレータ
    PSGサンプル1 シューマン波ジェネレータ SONY HB-G900の存在が旧ソビエト連邦の宇宙実験施設ミールのコアモジュール内に見つけることが出来る という話が興味深かったので、宇宙で使われたコンピュータ繋がりで 長期滞在型宇宙船に搭載された奇妙な設備装置の話を目にしたので製作事例としてMSXで再現してみた。 HB-G900はミール宇宙船の居住施設コアモジュールに設置されていたらしいが詳細や用途は不明である。 今回再現するこの装置は地球固有の電磁気振動を再現するもので旧ソビエト連邦のミールではなく、 米国のアポロ宇宙計画から出てくる話で、宇宙空間で長期滞在が必要となる月着陸のアポロ宇宙計画のため に必要とされた機能らしい。 これらは1960年代の欧米のアポロ計画とスペースラブ計画などで使用したとか、されたらしい という噂程度のものであるが、実験的に使用してみると地上で...
  • トップページ
    msx-sdcc のページ いまどきセルフ開発なんてダルくてやってらんないので 8 bit 用の C コンパイラ SDCC で無理矢理 MSX 用のソフトをクロス開発する方法をまとめたページ パワーユーザーは当時 X68k とか多機種に移行した気がするので、需要あるかどうかは不明 32k ROM / 2DD ディスクイメージ / メガロム を作成することを想定 MSX-BASIC は使用しません MSX-DOS なファイルも生成しないので、ディスク生成時は PHYDIO とかで直接セクタリードしてください 現状ではテクハン読んでサクサク意味わかるようじゃないと作成できません ↓何か要望などあればどぞ 適当に記事を追加しておいたから気にするな余。 -- *`∀´ ノ (2012-04-03 07 18 46) X68Kも10万円以下の廉価版がその後出てたら...
  • 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...
  • 漢字モード切替コマンドを作る
    漢字モード 一部の2と2+以降のハードウエアでは漢字ディスプレイモードが利用できる。 漢字ドライバと呼ばれる機能はDOS/Vにおける漢字表示機能と同じ。 漢字モードでは日本語マルチバイト文字対応のCPM互換DOSとなる。 漢字ドライバはDOS/Vにおける英語モードから日本語モードへの切替に相当する。 (DOSコマンドでchevやjp/us等に該当) DOSファンクションコールも日本語対応のため、日本語に対応したCPM互換環境ともいえる。 漢字画面モードはグラフィクスモードに依存しており0-3までの4種類がある。 漢字ドライバはBASIC環境でCALL KANJI0命令実行後初期化される。 DOS2ではフロッピーブート領域に識別子が記録され起動時に初期化可能だが BASIC以外で初期化方法はない。BASIC命令で初期化が必要。 DOSコマンドで漢字モー...
  • マシンステータスを得る
    マシンステータスを得る 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(&...
  • Moonsoundについて
    Moonsoundとは海外で作成された高音質サウンドカード。 ここではC言語から利用する場合の説明をする。 Moonsoundは拡張カートリッジとして作られており、音源はYAMAHA製のPCMサンプリング (16bitのwaveテーブル)とFM音源そしてPCM音源のデータセット(音のデータROM)を搭載している。 この音源に対しては、一部の海外製ゲームが対応していたり、音楽シーケンサーが作られた。 非常に良いサウンドを持つこのハードウエアには幾つかの互換性を持つクローンが存在する。 Moonsound自体は日本ではあまり有名ではなく、MIDI接続音源の方が一般的だった。 国内で多く流通してはいない。現在エミュレーション環境で再現することができる。 現在では幾つかのエミュレータにおいてMoonsoundの音源機能を再現しているので、そのステレオ サウンド音を体験...
  • VSYNC割り込み処理をCで記述する
    ROMBASICにはインターバルタイマーを利用したタイマー割り込み処理がある。 これは便利な機能だが、C言語で同様な処理を行なわせる場合、タイマー割り込みのフック (ジャンプテーブル)を書き換え、自前の割り込み処理関数をコールバックの形で呼び出す 仕組みにすればよい。 割り込み処理のフックから、C言語の割り込み処理関数をコールするように変更する場合は 若干工夫が必要になる。 実際の割り込みが生じた場合の処理フローは、 (Z80 Interupt) - BIOS(0x0-0x3FFF) - HOOK(0xFD9F) - DISKCALL(RST30h) - RET ここを自前の関数で置き換える必要がある。 (Z80 Interupt) - BIOS(0x0-0x3FFF) - HOOK(0xFD9F) - VSYNC_Int( ...
  • MAINROM又はSUBROMのあるスロットアドレスを得る
    MAINROM(通常はAPIやROMBASICインタプリタが記録されている)や SUBROM(2/2+以降の追加BIOS)は、Z80の物理アドレスを拡張したスロット と呼ばれる論理アドレスにマッピングされている。 このROMの場所を示すアドレスは、リニアなアドレス拡張ではないので スロットと呼ばれる形式でアドレス指定する必要がある。 (8086のセグメントベースレジスタのようなものと考えれば良い) つまり、0x8000など特定のアドレスを指定する場合は、MSXでは物理アドレスは拡張されているので正しくは、 [SLOT_POINTER(1,0)] [ADDRESS(0x8000)] という指定になる。 スロットアドレス指定は特殊なポインタであると考えると良い。 MAINROMとSUBROMのスロットアドレスは、起動時にROMBIOSファームウエアが...
  • Sleep関数を作る
    ウエイト処理などではforループを使うことも多いが、正確な時間で一時的に処理を止める ためにはCPU速度に依存しない正確な待ち時間処理が必要となる。 そこでシステムインターバルタイマを参照してsleep関数を作ってみる システムインターバルタイマーを使うと最小分解能1/60秒のsleep()関数を実装できる。 実装方法はシステムインターバルタイマーを参照し、初期化してから経過時間をチェックする。 システムタイマーは破壊的に変更されるが8bitマシンなので処理コストの小さな方法が有効。 新規に作成する関数はmsleep()という名前。一般的にはライブラリに存在する関数だが 環境によってはループ処理で代用されていたり実装されていない場合もある。 タイマーは環境依存するためANSI非互換だがラッパでsleep()を作ればANSI互換で時刻も正確に動作する。 引数は1...
  • VDPアクセス例
    既に作成したinp(),outp()I/O関数を用いてVDPを直接扱う。 VDPを直接設定し画面モードを切り替える場合は、BIOSと異なりレジスタの操作と画面初期化 などを必要とする。 新たに作成した関数はVDPレジスタアクセス、メモリーアドレス設定、フォント再設定の 三つの関数のみ。 VRAMへのアクセス方法は初めにアドレス(VMemadr)をセットし、後はI/Oダイレクト(outp/inp)に連続してリードライトする。 SCREEN8へ切り替えはVDPモードレジスタの設定だけでなく、CLS処理など 画面の初期化を行なう必要がある。 SCREEN8からテキストモードSCREEN0へ復帰する際は、9938/9958のフォントデータを 再セットアップする必要がある。 以下のサンプルコードは英数字のみ。 サンプル例はSCREEN0(W...
  • 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 } クリティカル指定された関数は、関数の実行時には必ず割り込みが禁止され、 終...
  • 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() に入る前の初期化 スタック設定とページ...
  • 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つあるチャンネルから、 各チャンネルの周波数と音量を設定するだけ。 音量をセットすると即座に音が発音する。...
  • 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); } ステータスを読む際に注意する点は、関数の...
  • as-z80 での関数記述
    WRTVRM のラップ例 呼び出し先のラベルは C のヘッダに書いた名前に _ を付けたものにする 引数はスタックに積まれる この関数では SP+0 リターンアドレス(L) SP+1 リターンアドレス(H) SP+3 nAddress(L) SP+4 nAddress(H) SP+5 nParam という順で格納されてコールされる この例では返値がないが、8 ビット返値は A レジスタに 16 ビット返値は HL レジスタに入れてリターンする ;------------------------------------------------------------------------------ ; WRTVRM. ; extern void msxBiosWriteVRAM( u16 nAddress, u8 nParam ); ;----...
  • 実行とデバッグ
    終了待ちしない VDP コマンドの実行結果とかが妙にリアルな blueMSX で実行/デバッグする 実行は普通に ROM イメージ/ディスクイメージ で読み込むだけ デバッグは blueMSX のデバッガ機能を使う map と asm を出力して、blueMSX のデバッガとにらめっこしながらデバッグする 死にかける 実機の場合は ROM イメージを 16k x2 に分割して、32k ROM イメージのランチャとかで実行 ROM 焼ける人は詳しくは知らんけど ihx のまま焼けるんじゃないの? ディスクイメージはそのままディスク作ってドライブに入れるだけ 1 chip だと似非RAMモードでメガロムとかも実行できると思われ
  • Z80割り込み処理について
    割り込みとはCPUが実行中に外部信号を受けて、実行中のプログラムから 一時的に割り込み処理プログラムを実行すること。 Z80の割り込み処理には大きく分けて2レベルの機能がある。 一つはソフトウエア的に割り込み処理を変更可能なINTと、 割り込みレベルが最も優先されるNMIである。 NMIは例えば電源が低下した時などあらゆる処理に優先されるような イベントをキャッチする際に用いられる。 通常の割り込み処理にはINTを使う。 2レベルの割り込みに加えてZ80のINT割り込みモードはさらに3つある。 モード0と呼ばれる割り込みは8080互換で、8080用の割り込みコントローラ 接続を前提としている。 このモードは複数の割り込みレベルを持ち、複数の割り込み信号をキャッチ できる。 割り込みされた場合、ジャンプ先は自動的にRST0h~RST38hなどのアド...
  • スロット
    スロット スロットと呼ばれる方式はメモリ拡張の仕組みでZ80b物理アドレス64KB空間を リニアに拡張するのではなく、16KBごとにページングされたアドレス領域を相互に切り替える事で アドレス空間の拡張と、外部外付けカートリッジへの対応を実現している。 Z80CPUの設計上は64Kbの物理アドレッシングを持つので、このメモリ空間を4つに分割し 16KB単位のページングを行なう。 詳細は、 MSX2 Technical Handbook 7章 スロットとカートリッジを参照。 スロットの16KB単位のページは他の64Kbメモリ空間と切り替える事でメモリを拡張するが、 その基本的なイメージを示す。 0 FFFF---------------|p0 |p1 |p2 |p3 |--------------- ...
  • 漢字ROMからフォントデータを読み出す
    漢字フォントROMはI/Oポートの0xD8-0xDBに接続されている。 漢字フォントは16x16ドットのフォントデータを持っている。 このフォントROMは漢字の使用頻度によって第一水準、第二水準という区分があり、 第一水準の漢字フォントをリードする場合は、0xD8,0xD9にアドレスを出力する。 第二水準漢字フォントをリードする場合は0xDA,0xDBにアドレスを出力する。 データの読み出しは第一水準の場合、アドレス送出後、0xD9を32回リードする。 第二水準の場合はアドレス送出後、0xDBを32回リードして16x16フォントデータを得る。 漢字ROMフォントへアドレス出力する場合は2byteを必要とするが、この時のアドレスは 区点コード(漢字フォント格納形式)という特殊な形式で扱う必要がある。 直接文字コードであるSJISコードを出力して漢字フォント...
  • YM2413FM音源の使い方
    YM2413はFM音源LSIで、MUSIC規格に採用されているLSI。 この音源LSIはモノラルFM音源で、同時発音数が9チャンネル、または 6+5リズムを持つ。 LSIのROMに音色データが予め設定されており、難しいFM音源の設定を必要としない。 また独自の音色を一つだけ設定することができる。 LSIは書き込み専用でレジスタの読み込みやステータス状態を知ることは出来ない。 有効アクセス時間があるので、連続データ書き込み時はウエイトを採りタイミングに注意する必要がある。 YM2413はI/Oポートの0x7C,0x7Dに接続されている。 このFM音源チップは0x7Cに音源LSI内部レジスタの設定、0x7Dにデータの 書き込みを行なう。 FM音源LSIのレジスタ内容は書き込み専用でレジスタの参照は出来ない。 レジスタは38個あり、それぞれの内容はレジスタ...
  • 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...
  • @wiki全体から「MSXDOS用putchar()標準ライブラリの修正」で調べる

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

ツールボックス

下から選んでください:

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