mz-80K パラレル8255(キーボード、CMT他)
8255(使用ポート 0E000H〜0E003H) キー入力、CMT制御、カーソル点滅タイミングの設定、LEDの表示を行います PAは出力、PBは入力、PC7〜4は入力、PC3〜0が出力 0E000H:8255 PA(出力) KEYPA d7:PA7 NE555 RST カーソル点滅用タイマ 1=リセットしない、0=リセットする d6:未使用 d5: 〃 d4: 〃 d3:PA3 キーセレクト用 d2:PA2 キーセレクト用 d1:PA1 キーセレクト用 d0:PA0 キーセレクト用 0E001H:8255 PB(入力) d7:PB7 キーデータ D7 d6:PB6 キーデータ D6 d5:PB5 キーデータ D5 d4:PB4 キーデータ D4 d3:PB3 キーデータ D3 d2:PB2 キーデータ D2 d1:PB1 キーデータ D1 d0:PB0 キーデータ D0 0E002H:8255 PC(KEYPC) d7:PC7(入力)/VBLANK d6:PC6(入力)NE555 OUTPUT カーソル点滅用タイマのステータスビット 入力 d5:PC5(入力)RDATA CMT読み込みデータ d4:PC4(入力)MOTOR CMTモータの状態 1=回転、0=停止 d3:PC3(出力)M−ON CMTモータの回転・停止の切り替え 立ち上がり(0→1)で切り替わる。 d2:PC2(出力)LEDの切り替え 1=緑(英数)、0=赤(カナ) d1:PC1(出力)WDATA CMT書き込みデータ d0:PC0(出力)/VGATE 1=画面の表示をする、0=画面の表示をしない。 0E003H:8255 CW(KNAST) 8255のコントロールワード
キーボードスキャン キーボードのデータを読み取るにはキーセレクト(PA3〜0)を設定して、 キーデータ(PB7〜PB0)を読む事できます キーセレクトは0〜9まで
<LEDの表示> PC2を出力して2つのLEDのどれかを点灯します あくまでLED点灯の切り替えなので キー入力の英数/カナ・モードは反映されません 1=緑のLEDの点灯(英数) 0=赤のLEDの点灯(カナ) <カーソルの点滅> 点滅自体はソフトウェアで行いますが 点滅するタイミングをNE555(カウンタIC)でとります PA7でカウンタNE555のリセットを行います PC6でカウンタNE555のステータスビット入力を行います <画面の表示> PC0で画面の表示の制御を行います VRAM(0D000H〜0D3E7H)の内容をクリアするわけではありませんが VRAMを一度に転送する時(画面クリア等)に使用します 1=画面の表示をする 0=画面の表示をしない
CMT PC3でモータ制御、PC4でモータ状態 PC1がCMTライト、PC5でCMTリード タイミングは全てソフトで行い、 モニタでは1200ボーのシャープPWM方式で読み書きを行います またモニタからロード出来るのはOBJ(バイナリファイル)のみ <CMTモータ制御> PC3を0→1にするとモータのオン/オフが行えます ただしCMTの[PLAY](+[REC])ボタンが押されていないと モータ自体は動きません モータは最初は停止しているので 1回目、PC3:0→1でモータオン 2回目、PC3:0→1でモータオフ 以降0→1でオン/オフの繰り返し <CMTのモータの状態> PC4を監視するとCMTモータの状態がわかります 1=CMTモータ オン状態 0=CMTモータ オフ状態 長いパルスが1(464μs+494μs) 短いパルスが0(240μs+264μs)で記されます。 読み込む場合 0→1になってから368μs経って 1のままだと”1”、0だと”0”のパルスという事になります インフォメーションブロック(FCB) ”0”*22000 10sec ”1”*40+”0”*40 テープマーク ”1” インフォメーション1 128バイト チェックサム1 2バイト ”1” ”0”*256 インフォメーション2 128バイト(インフォメーション1と同じ) チェックサム2 2バイト(チェックサム1と同じ) ”1” データブロック ”0”*11000 5sec ”1”*20+”0”*20 テープマーク ”1” データブロック1 nnmmバイト チェックサム1 2バイト ”1” ”0”*256 データブロック2 nnmmバイト(データブロック1と同じ) チェックサム2 2バイト(チェックサム1と同じ) ”1” (注)チェックサムは単純にデータを足したものではなくビット内容”1”の総合計になります データが0FFHなら11111111Bで”1”が8つなので+8 0C0Hなら11000000Bで”1”が2つなので+2 000Hなら00000000Bで”1”が0 なので+0 1バイトデータの内容 ”1”、d7、d6、d5、d4、d3、d2、d1、d0 <インフォメーションブロックの内容> ファイルタイプ 1バイト 01=OBJ、02=BTX、03=BSD等 ファイルネーム 16バイト 16文字以下なら最後に00DHが入る 予備 1バイト ファイルネームが16文字なら00DH 長さ 2バイト 下位、上位の順 ロードアドレス 2バイト 下位、上位の順 実行アドレス 2バイト 下位、上位の順 BTXアンリスト 1バイト 000H=オフ、001H=オン BTXオートスタート 1バイト 000H=オフ、001H=オン コメント 102バイト ファイルタイプ 001H:OBJ マシン語のファイル(WICS、M−FORTHのソース等) 002H:BTX BASIC、BASEソース 003H:BSD BASICシーケンシャルデータファイル 004H:BRD BASICランダムデータファイル :ASC アスキーファイル(アセンブラ、FORMのソース等) 005H:RB リロケータルバイナリファイル 006H:ASS 007H:EDT 0A0H パスカルインタープリタプログラム 0A1H パスカルデータ ASCファイルについて ファイルタイプ004Hのデータブロックは 1ブロック(0100Hバイト)ごと区切られます 端数が出る場合は残りの端数だけになります mz−700用Hu−BASIC V2.0について V1.0〜1.3(mz−80K用Hu−BASIC)よりも 同時期のX1やmz−2000のHu−BASICに寄せているらしく インフォメーションブロックの内容が少し違います ファイルタイプ 1バイト 01=OBJ、02=BTX、04=BSD等 ファイルネーム 13バイト 拡張子 3バイト パスワード用 1バイト (020H=指定なし) 長さ 2バイト 下位、上位の順 ロードアドレス 2バイト 下位、上位の順 実行アドレス 2バイト 下位、上位の順 その他 104バイト ここで注意するのはパスワードで mz−80KのROMルーチンコールで SAVEしたファイルはファイル名は最大16文字 16文字未満の場合00DHが埋まります(V2.0は020Hが埋まる) いずれにしろパスワード部分は00DHが入るので mz−700用Hu−BASIC上でロードすると パスワードエラーとなります またパスワードは1バイトに合成されます ----------------------------------------------------------- 市販のソフトについて 通常のテープフォーマットがオートスタートをサポートしているので 他機種の様に工夫してオートスタートする必要がありませんが たまに変わった事をしているソフトがあります <多段プログラム> よくあるのはPCG定義用プログラム、メインプログラムの2本 市販品だけでなく雑誌のプログラムでも見かけます PCG定義を終えたら JP 000D9H で2本目をロード、実行を行うタイプ mz−80Kのモニタでは 次のインフォメーションブロックをみつけたら LOADING ファイル名”を表示してロード実行を行いますが mz−700のモニタでは モニタコマンドのコマンドチェックの途中に飛んでしまいます 幸いプロンプト画面になるので手動でロードすれば 一応、残りをロード、実行までは出来ます <ハドソン系の場合(PUCK PUCK、PALL等)> ロードするとタイトル画面がすぐに表示され、 次のプログラムがロード、実行される ●PUCK PUCKの場合 通常ファイルでローダ、プログラム、ミュージックの3本 ローダ :PUCK PUCK、 0D000H〜0D3FFH、実行は0D3E8H プログラム :PUCK OBJ、 02C00H〜084F3H、実行は02C00H ミュージック:MUSIC DATA、0A000H〜0CAFFHとなる ローダはVRAMと残り空き領域にプログラムがあります 直接VRAMにロードされ画面にゲームタイトル画面が表示 残り空き領域(非表示部分)にもロードされ実行される ローダ自体は9バイトのプログラムになっている D3E8: CALL 00027H ;FCB部をロード CALL 0002AH ;データ部をロード JP 02C00H ;ロードしたプログラムを実行 プログラムがロード、実行されても画面はそのままクリアせず ゲームプログラムの方でミュージックプログラムをロードする ミュージックデータがロード終了すればロード終了となる <OAK系の場合> mz−700以降になりますが一旦ROMモニタを0B000Hへ転送 00000H〜00FFFHをRAMに切り替え、 0B000Hからのモニタ00000H〜00FFFHのRAMに転送して CALL 00027H ;FCB部をロード JP 00118H ;データ部をロード、FCBの実行アドレスへ飛ぶ を実行する モニタROMを同じアドレスのRAMにコピーしているだけですが ROMは1WAIT、RAMはNO WAITなので テープルーチンのタイミングが少し変わるのを利用しているようです また海外OAK系のソフトも同じ事をしているようです <EDASの場合> 独自のCMTルーチンで 新しいフォーマット(EDAS共通テープ)を持ちます mz−80Kとmz−700では動作クロックが違うため mz−80K用のEDASを mz−700で実行出来てもテープアクセスは不可となります それぞれの対応した機種用のEDASが必要になります
mz−80Kのコーナへ Home へ戻る