日立 MB-6892 レベル3 VRAMエリアが移動できるか確認してみる^^

Last Updated on 2020年3月26日 by kabekin

レベル3でCP/MやFLEX9を動作させるためにはALLRAMモードで動作させる必要があると思うのですが、そうなると$400から始まるVRAMエリアは邪魔になりそうです。

というわけで、CRTCの参考書籍を確認してみるとHD46505ではレジスタR12とR13でVRAMの先頭アドレスを指定するとの説明がありました。

早速、L3エミュでCRTCのR12,R13レジスタに何が書かれているのか調べたところ、
R12=$04
R13=$00
と、VRAMの先頭アドレスががそのままセットされておりました^^
レベル3の回路図見た感じではVRAMは独立したメモリがあるわけではなく主記憶の一部を間借りしているだけっぽいので、そのままR12,R13を変更するとVRAMエリアを移動できそうです。

S1の取説にはCRTCの設定パラメータの記述があるのですがレベル3の取説は持っていないのでパラメータが不明(レベル3マーク5の取説をお持ちの方是非貸して下さい^^;;;)

資料が無いのでL3エミュでCRTCのアドレス$FFC6,$FFC7のストア部分をトレースして値を確認。

  ■I/Oアドレス
  $FFC6 CRTC アドレスレジスタ(W)
  $FFC7 CRTC データレジスタ(R/W)
  CRTCにデータをストアする部分 $FB7B
  ■CRTC(HD46505SP)レジスタパラメータ(L3)
 ┌─────────┬─────────────┬─────────────┐
 │水平文字数        │           40文字        │          80文字         │
 │NEWON             │     NEWON3       NEWON11 │    NEWON7       NEWON15  │
 │                  │     HIRESO       NORMAL  │    HIRESO       NORMAL   │
 │解像度            │     320*200      80*100  │    640*200      160*100  │
 │SCREEN,,1/,,0     │ノンインタ インタレース  ノンインタ インタレース│ノンインタ インタレース  ノンインタ インタレース│
 │MODE-SEL FFD0     │ $00   $00     $40   $40  │ $80    $80    $C0   $C0  │
 │MODE              │        0                 │         1                │
 ├─────────┼─────────────┼─────────────┤
 │R0  水平総文字数  │       $3F           $3F  │        $7F         $7F   │
 │R1  水平表示文字数│       $28           $28  │        $50         $50   │
 │R2  水平同期位置  │       $31           $31  │        $5F         $5F   │
 │R3  同期パルス幅    │       $85           $85  │        $8A         $8A   │
 │R4  垂直総文字数  │       $1F           $1F  │        $1F         $1F   │
 │R5  トータルラスタアジャスト │       $06           $06  │        $06         $06   │
 │R6  垂直表示文字数│       $19           $19  │        $19         $19   │
 │R7  垂直同期位置  │       $1C           $1C  │        $1C         $1C   │
 │R8  インタレース&スキュー   │ $40   $43     $40   $43  │ $40    $43    $40  $43   │
 │R9  最大ラスタアドレス  │ $07   $0E     $07   $0E  │ $07    $0E    $07  $0E   │
 │R10 カーソルスタートラスタ   │ $27   $2A     $27   $2E  │ $27    $2E    $27  $2E   │
 │R11 カーソルエンドラスタ   │ $07   $0F     $07   $0F  │ $07    $0F    $07  $0F   │
 │R12 スタートアドレス(H)  │ $04   $04     $04   $04  │ $04    $04    $04  $04   │
 │R13 スタートアドレス(L)  │ $00   $00     $00   $00  │ $00    $00    $00  $00   │
 │R14 カーソル(H)       │ $04   $04     $00   $04  │ $04    $05    $04  $04   │
 │R15 カーソル(L)       │ $00   $00     $00   $00  │ $00    $18    $00  $00   │
 │R16 ライトペン(H)     │       N/A           N/A  │        N/A         N/A   │
 │R17 ライトペン(L)     │       N/A           N/A  │        N/A         N/A   │
 └─────────┴─────────────┴─────────────┘
  上記のノンインタレースはインタレース→ノンインタレースに変更したときの値
 ノンインタレースからインタレースに変更したときもR8~R15までのみストアしていた
  →R0~R7は同様なのでINIT時のみストア?
 WIDTH80⇔WIDTH40の変更ではR0~R3とR12~R15がストアされた

結局、S1の取説にあったパラメータと同じでした・・・^^;;;

これを踏まえて整理すると、

R4~R7は全モード共通
グラフィック解像度はMODE-SELの違いのみでCRTCパラメータの違いはない
R10,R11,R14,R15はカーソル表示用←設定パラメータではない?
R12,R13はVRAMの先頭アドレス
となるので、
こんな感じにテーブルにまとめてみました。

* CRTCパラメータテーブル(L3)
TBL40   FCB $00,$3F,$28,$31,$85,$FF          ;40文字モード
TBL80   FCB $00,$7F,$50,$5F,$8A,$FF          ;80文字モード
TBLCOM1 FCB $04,$1F,$06,$19,$1C,$FF          ;共通パラメータ1(R4~R9)
TBLCOM2 FCB $0A,$2E,$0F,$04,$00,$04,$00,$FF  ;共通パラメータ2(R10~R15)
TBLIL   FCB $08,$43,$0E,$FF                  ;インタレースモード
TBLNIL  FCB $08,$40,$07,$FF                  ;ノンインタレースモード

各テーブル1バイト目にCRTSのRegNo, その後データ, デリミタを$FFにしてみました。
これをまとめてVRAMが移動できるか確認するテストプログラムを作成^^

FFD0              MODESEL    EQU      $FFD0       ;画面/ACIAモード
FFC6              CRTCAR     EQU      $FFC6       ;CRTCアドレスレジスタ
FFC7              CRTCDR     EQU      $FFC7       ;CRTCデータレジスタ
5000                         ORG      $5000
5000 2000                    BRA      START
5002              START      EQU      *
5002 108EFFC6                LDY      #CRTCAR     ;CRTCアドレスセット
                  * MODE-SELセット
5006 86C0                    LDA      #$C0
5008 B7FFD0                  STA      MODESEL
                  *CRTCセット
500B 308D002E                LEAX     TBL80,PCR
500F 8D13                    BSR      PARAMSET
5011 308D002E                LEAX     TBLCOM1,PCR
5015 8D0D                    BSR      PARAMSET
5017 308D0036                LEAX     TBLIL,PCR
501B 8D07                    BSR      PARAMSET
501D 308D0028                LEAX     TBLCOM2,PCR
5021 8D01                    BSR      PARAMSET
5023 39                      RTS
                  *CRTCにパラメータをセットSub.
                  *X=PARAMテーブルのポインタ
                  *Y=CRTCのアドレスL
5024              PARAMSET   EQU      *
5024 3436                    PSHS     D,X,Y
5026 A680                    LDA      ,X+         ;CRTC RegNo取得
5028 E680         LP1        LDB      ,X+         ;CRTS PARAMを取得
502A C1FF                    CMPB     #$FF
502C 2707                    BEQ      FIN
502E A7A4                    STA      ,Y
5030 4C                      INCA
5031 E721                    STB      1,Y
5033 20F3                    BRA      LP1
5035 35B6         FIN        PULS     D,X,Y,PC
                  * CRTCパラメータテーブル(L3)
5037 003F283185FF TBL40      FCB      $00,$3F,$28,$31,$85,$FF ;40文字モー
503D 007F505F8AFF TBL80      FCB      $00,$7F,$50,$5F,$8A,$FF ;80文字モー
5043 041F06191CFF TBLCOM1    FCB      $04,$1F,$06,$19,$1C,$FF ;共通パラメ
5049 0A2E0F040004 TBLCOM2    FCB      $0A,$2E,$0F,$04,$00,$04,$00,$FF ;共
     00FF
5051 08430EFF     TBLIL      FCB      $08,$43,$0E,$FF ;インタレースモード
5055 084007FF     TBLNIL     FCB      $08,$40,$07,$FF ;ノンインタレースモ

エミュで確認した値とS1の取説にあった値は同じでしたので、
その値をCRTCにセットするだけのプログラムですが、
思うように動作しません・・・・

参考にした書籍によると画面モードによってCRTCに供給されるクロックを変える必要があるそうです。
レベル3の資料でこれを調べると$FFD0にMODE-SELというレジスタがあり40/80文字モードとグラフィックの解像度を変更できるレジスタがありましたのでCRTCのパラメータに加えMODE-SELもセットしています。

S1には上記に加えSCRN-MODEというレジスタがあるようですがL3にはなさそうです。
何か別の手続きが必要で、それが抜けているんだと思います^^;;;

そもそも、CRTCのパラメータを変えただけではダメで他に何かする必要があるのかも・・・

知識がなく、完全に手探り状態です^^;;;


しかし、この状態でも表示は出ているのでVRAMが移動できるものなのか調べてみました。
CRTCの設定でVRAMの先頭アドレスを$3000~と指定して、

$3000~データをセットしてみると、

無事表示されました。

カラーRAMの関係もあるのか文字色は青でした。

カラーRAMの扱い方は調べないとわからないので、簡単に変更できる背景色を変更。
POKE &HFFD0,&HC4

色々と残件が残りましたが、VRAMエリアが移動できることが確認できました。
そんなレベル3VRAM移動の記録・・・


残件メモ
CRTCパラメータ設定後の表示の乱れ
$400~VRAMを移動したときのカラーRAMの扱い

20件のコメント

  1. VRAMの領域を移動できるとは考えていませんでした.
    VRAMの部分にはアトリビュートRAMもありますので,アトリビュートRAMの無いアドレスには移動できないのでは無いでしょうか?例えば$6000とかに移動できますでしょうか??

    1. Level3さんの予想通りカラーRAMの無いエリア($4400以降~)をCRTCに指定して同じことをしてみると文字が表示されませんでした。
      レベル3でCP/MやFLEX9を動作させる場合$400~のVRAMは邪魔だと思うのですがLevel3さんのCP/M80ではVRAMエリアはどのように実装されておられるのでしょうか
      カラーRAMの関係で別のエリアに移動できないとなると更に困ると思うのですがどのようにするのが良いのでしょう・・色々迷走中です^^;;;

      1. お返事が遅くなってしまいましたが,HuEngineは独自に64KBのRAMを持っていますのでCP/M80のTPAには何の制限もありません.09側のBIOSルーチンで画面への書き込みを行うだけですから…

        1. そうでした!HuEngineを使ったCP/M80はHuEngine側の64KメモリにTPAがあるので問題なかったですね。
          S1も同じようにZ80側が使うメモリと6809が使うメモリはエリアが違うので問題ありませんでした
          S1はメモリ管理の難しさがあるので、レベル3で訓練しようかとレベル3に路線変更しようと思いましたが、VRAMや割込みベクタなどBASIC以外で使う場合のレベル3にはレベル3の難しさがありました^^;;;

  2. VRAMエリア(COLOR RAMも)は$0400~$4400固定です。CRTCのR12,R13に$0~$3FFを指定すると回路側で+$4000されます。

    1. やっぱりVRAMエリアは固定での使用ですよね^^
      S1やFM-7はCP/Mのメモリ範囲から見えない位置にVRAMがあるので問題無いと思うのですが、
      レベル3だとTPAエリア内にあるので邪魔なのではと思い色々調べています。
      (もしかすると的外れな考えなのかもしれません・・・^^;;)
      オールRAMモードで動作させる場合は入出力はROMのサブルーチンを使わずに自前で実装すると
      聞いたので、自前で実装するのであれば邪魔にならない位置に移動できればと思い実験中です^^

      1. CP/Mで必要なメモリがどれぐらいかよくわかっていないのですが(^^、VRAMエリアにもプログラムを置いて実行できますので、例えばテキスト表示のみに限定して$3C00~$43FFの2KBをVRAMにして残りをプログラム領域にすることはできます。
        ただ別の問題として、$00FD~$0111を割り込みベクタとして使用するので、この領域は避ける必要があります。
        CRTCの件については、エミュレータのバグのような気もしてきましたので、こちらで調査してみます。

        1. $3C00~$43FFをVRAMにして残りをTPAにするのは良さそうですが、TPA領域を歯抜けにする方法が分からないので色々調べています^^;;;
          テキスト表示のみでグラフィックを使わないことで画面表示に影響を与えない方法があればいいのですが、$3C00~$43FFにプログラムがロードされてしまうとテキスト表示に影響が出るのではないかと思っています^^
          割込みベクタも悩ましいですね。
          FM7は$FFF2からのベクタが書き換えられるのですがレベル3は書換できないようですね
          $0100からのワークエリアを使うしかなさそうで、こちらも謎が残っています^^;;
          CRTCの件は私も検証不足ですので、私のテストがポンコツの可能性が高いです・・・

          1. TPAはコマンドをロードするのでしたね。となると歯抜けには出来なさそう。割り込みベクタ$FFF2~$FFFFもROMなので変更できないですね。マーク5限定ならバンク切り替えでRAMに出来ますが。やはり、拡張カードに何らかの細工がありそうです。なので私はお手上げ(^^;;;;
            CRTCの件ですが、こちらはバグではなくレベル3 BASICのワークエリアを同時に変更する必要があります。
            $00A2が文字数(40 or 80)、$00A3-A4が表示画面の開始アドレス(CRTCのR12,R13と同じ値)、$00A7がスクリーンモード($00:40字ノーマル、$01:80字ノーマル、 $02:40字ハイレゾ、 $03:80字ハイレゾ)となります。
            また、カーソルの位置ずれはCRTCのR8を$4xから$8xにすると直ります。レベル3とS1ではカーソルスキューが違うようです。
            インターレス・ノンインターの文字セット切り替えは$FFD6(INTERACE-SEL)のビット3で行います。

          2. レベル3のVRAMエリアと割込ベクタは引き続き色々調べてみます^^
            CRTCの件、情報ありがとうございます
            ROMのサブルーチンを使用しない環境でCRT出力をしたくて実験していたのですが、CRTCのパラメータ設定の後にワークエリアに設定しないといけないというのは悩ましいですね^^
            CRTCのパラメータを設定した後に頂いたコメントの通りワークエリアを設定すると正常に表示できました。
            ROMのサブルーチンを調べる際にワークエリアに関連する部分も調査が必要ってことですね^^
            なかなか奥が深いです(笑

  3.  こんばんは、MB-6892 の資料(MARK5解体新書)を少し見てみました。
     VRAMの影響を受けずにフルRAM化するには、64KB拡張RAMカードを追加する想定のようで、PIA-Aポートと BANK-REG($FFE8) を操作して拡張RAMを2分割でバンク切換し、制御を移して利用する説明になっていました。
     標準の VRAM領域($0400-)は裏にあるカラーRAM の関係もあり、CRTCとの関係は固定されているように思いましたがどうでしょうか。

    1. マーク5は拡張RAMを使うとオールRAMで動作できそうなのですが、初代やマーク2ではどうしてもVRAMが邪魔になりそうで、悩んでおります^^;;
      当時はレベル3用のFLEX9やOS-9が存在したようですので、何かいい方法があると思います^^
      それにしてもFM7用のFLEX9やOS-9は時々見かけますがレベル3用は見たことが無いですね。

      1.  なるほど L3/MarkII でどうなっていたかも気になりますね。
         FLEX09 はソフトウェアのみで、S1のL3モードでも動作可能と書かれていました。
         L3/MarkII/Mark5 ともにカラーRAM と CRTCの関係から、$0400-$4767 以外を VRAMとすることは基本的にないと思えますので、FLEX09は仕様通りユーザエリアの先頭(ハイレゾを使うのであれば $4768)以降のアドレスで実装されていたのではないでしょうか。
         他方 OS-9L1は専用カードを使うようですので、ワークや VRAM領域をバンク切換して先頭からリニアな RAM空間を作っていた可能性は考えられそうです。

        1. ホント、初代レベル3やマーク2でどうやってFLEX9を動かしていたのか興味深いです。
          FLEX9のソフトはバイナリ内にロードアドレスや実行アドレスを持っているようなのでOS側でTPAの開始アドレスを自由に設定できないのではと予想しています。
          OS-9の専用カードの写真を見ると一つのLSIはRTC(MC146818)で、もう一つはPIA(6821)で拡張プリンタ用だと予想しているのですが、バンク切替などもあるんですかね!?
          でもバンク切替できるRAMは無さそうな感じも・・・
          せるじおさんの方で今後レベル3のFLEX9を見る機会がありましたら、情報をお願い致します^^

          1.  OS-9カードの写真あるんですね!RAMが載ってないようでしたらバンク切換してなさそうですね・・・失礼しました。しかし外部プリンタ用のコネクタがあるんでしょうか?不思議なカードですね。
             ちょうど AppleII の 6809カード(THE MILL)上で動作する OS-9L1 の記事があったので見てみましたが、このカードも RAM は積んでおらず、本体側の RAM を使うようでした。
             また L3 の OSについて何か発見がありましたらまたレポートしたいと思います^^

          2. せるじおさんから貸し出し頂いた資料の写しで確認致しましたので同じ写真かと思います^^;;;
            基板左側はアンフェノールの36Pっぽいコネクタが見えますので40PのLSIがPIAだと予想致しました。
            基板右側にリボンケーブルのコネクタが見えるので、もしかすると2枚セットの基板でもう一枚にRAMがあるのかもしれません。
            基板の写真を見ているだけで想像が広がってきてワクワクしますね^^

          3. 初代のL3ではRAMはMAX40KBでしたから,このエリア内でFLEXを動かしていたのではないでしょうか?
            なお,私の初代L3は自前で改造してフルRAM化してあります.もっとも後2KBはROMが優先されるようになっていますので実際には62KB-RAMですが.この状態でROMの部分をDISK-BASICの後に書き加えてBOOTルーチンを改造することで62KB-RAMの状態でBOOT時にRAM上にROMの内容を上書きする形でBASICをRAM化して動かしていました.
            ちなみに当時はレジスタへの書き込みで切り替えるような工作ができなかったのでフロントパネルにトグルスイッチを付けてスイッチで切り替えるようにしていました…

          4. その後、情報を頂いてレベル3用のFLEX9はOS起動後にソフトをリロケートしてレベル3のメモリマップ変換するソフトが添付されていたそうです。
            それでFLEX9からもVRAMエリアを使わないように工夫をしないとダメだと思いますのでOSにも何らかの工夫があったと思われます。
            これでは私の手に負えないのでマーク5の拡張RAMを使ってチャレンジしようと思います。

  4. FLEX9のドキュメントによるとメモリに関しては
    1)$C000から8KBのRAM、$0000から少なくとも12KBのRAM ・・・△(半分NG)
    が要求事項ということですが一般には
    $0000~$BFFFはUSER RAM領域でこの領域の最上位アドレスが$CC2B-$CC2C(Memory End)
    に格納されているということのようです。
    FLEX9のバイナリ(.CMD)はCP/M80(.COM)より柔軟でたとえば
    $0400-$43FFを避けてプログラムを配置するということが可能です。
    「バイナリをVRAM領域に配置しないでね」という制限付きなら
    まぁ実現可能ではないでしょうか?

    1. トランジェントコマンドについてはご想像の通りVRAMのエリアを避ければOKのようで、レベル3用FLEX9にはアセンブラやエディタ等のソフトをリロケートするソフトが付属していたという情報を頂きました^^
      それでもVRAMエリアにデータがロードされてしまうと即座に画面が乱れると思いますのでOS側にも何かの細工が必要そうですね。
      VRAM以上に始末が悪いのが割込みベクタでFMの割込みベクタは$FFF2~のエリアが書換できるようなのですがレベル3はワークエリアに飛んできておりここが変更できないので、これは難儀です・・・
      私にはマーク5の拡張RAMを使ったALLRAM構成でなければ解決できそうにないです^^;;;

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください