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 へ戻る