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の扱い
VRAMの領域を移動できるとは考えていませんでした.
VRAMの部分にはアトリビュートRAMもありますので,アトリビュートRAMの無いアドレスには移動できないのでは無いでしょうか?例えば$6000とかに移動できますでしょうか??
Level3さんの予想通りカラーRAMの無いエリア($4400以降~)をCRTCに指定して同じことをしてみると文字が表示されませんでした。
レベル3でCP/MやFLEX9を動作させる場合$400~のVRAMは邪魔だと思うのですがLevel3さんのCP/M80ではVRAMエリアはどのように実装されておられるのでしょうか
カラーRAMの関係で別のエリアに移動できないとなると更に困ると思うのですがどのようにするのが良いのでしょう・・色々迷走中です^^;;;
お返事が遅くなってしまいましたが,HuEngineは独自に64KBのRAMを持っていますのでCP/M80のTPAには何の制限もありません.09側のBIOSルーチンで画面への書き込みを行うだけですから…
そうでした!HuEngineを使ったCP/M80はHuEngine側の64KメモリにTPAがあるので問題なかったですね。
S1も同じようにZ80側が使うメモリと6809が使うメモリはエリアが違うので問題ありませんでした
S1はメモリ管理の難しさがあるので、レベル3で訓練しようかとレベル3に路線変更しようと思いましたが、VRAMや割込みベクタなどBASIC以外で使う場合のレベル3にはレベル3の難しさがありました^^;;;
VRAMエリア(COLOR RAMも)は$0400~$4400固定です。CRTCのR12,R13に$0~$3FFを指定すると回路側で+$4000されます。
やっぱりVRAMエリアは固定での使用ですよね^^
S1やFM-7はCP/Mのメモリ範囲から見えない位置にVRAMがあるので問題無いと思うのですが、
レベル3だとTPAエリア内にあるので邪魔なのではと思い色々調べています。
(もしかすると的外れな考えなのかもしれません・・・^^;;)
オールRAMモードで動作させる場合は入出力はROMのサブルーチンを使わずに自前で実装すると
聞いたので、自前で実装するのであれば邪魔にならない位置に移動できればと思い実験中です^^
CP/Mで必要なメモリがどれぐらいかよくわかっていないのですが(^^、VRAMエリアにもプログラムを置いて実行できますので、例えばテキスト表示のみに限定して$3C00~$43FFの2KBをVRAMにして残りをプログラム領域にすることはできます。
ただ別の問題として、$00FD~$0111を割り込みベクタとして使用するので、この領域は避ける必要があります。
CRTCの件については、エミュレータのバグのような気もしてきましたので、こちらで調査してみます。
$3C00~$43FFをVRAMにして残りをTPAにするのは良さそうですが、TPA領域を歯抜けにする方法が分からないので色々調べています^^;;;
テキスト表示のみでグラフィックを使わないことで画面表示に影響を与えない方法があればいいのですが、$3C00~$43FFにプログラムがロードされてしまうとテキスト表示に影響が出るのではないかと思っています^^
割込みベクタも悩ましいですね。
FM7は$FFF2からのベクタが書き換えられるのですがレベル3は書換できないようですね
$0100からのワークエリアを使うしかなさそうで、こちらも謎が残っています^^;;
CRTCの件は私も検証不足ですので、私のテストがポンコツの可能性が高いです・・・
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で行います。
レベル3のVRAMエリアと割込ベクタは引き続き色々調べてみます^^
CRTCの件、情報ありがとうございます
ROMのサブルーチンを使用しない環境でCRT出力をしたくて実験していたのですが、CRTCのパラメータ設定の後にワークエリアに設定しないといけないというのは悩ましいですね^^
CRTCのパラメータを設定した後に頂いたコメントの通りワークエリアを設定すると正常に表示できました。
ROMのサブルーチンを調べる際にワークエリアに関連する部分も調査が必要ってことですね^^
なかなか奥が深いです(笑
こんばんは、MB-6892 の資料(MARK5解体新書)を少し見てみました。
VRAMの影響を受けずにフルRAM化するには、64KB拡張RAMカードを追加する想定のようで、PIA-Aポートと BANK-REG($FFE8) を操作して拡張RAMを2分割でバンク切換し、制御を移して利用する説明になっていました。
標準の VRAM領域($0400-)は裏にあるカラーRAM の関係もあり、CRTCとの関係は固定されているように思いましたがどうでしょうか。
マーク5は拡張RAMを使うとオールRAMで動作できそうなのですが、初代やマーク2ではどうしてもVRAMが邪魔になりそうで、悩んでおります^^;;
当時はレベル3用のFLEX9やOS-9が存在したようですので、何かいい方法があると思います^^
それにしてもFM7用のFLEX9やOS-9は時々見かけますがレベル3用は見たことが無いですね。
なるほど L3/MarkII でどうなっていたかも気になりますね。
FLEX09 はソフトウェアのみで、S1のL3モードでも動作可能と書かれていました。
L3/MarkII/Mark5 ともにカラーRAM と CRTCの関係から、$0400-$4767 以外を VRAMとすることは基本的にないと思えますので、FLEX09は仕様通りユーザエリアの先頭(ハイレゾを使うのであれば $4768)以降のアドレスで実装されていたのではないでしょうか。
他方 OS-9L1は専用カードを使うようですので、ワークや VRAM領域をバンク切換して先頭からリニアな RAM空間を作っていた可能性は考えられそうです。
ホント、初代レベル3やマーク2でどうやってFLEX9を動かしていたのか興味深いです。
FLEX9のソフトはバイナリ内にロードアドレスや実行アドレスを持っているようなのでOS側でTPAの開始アドレスを自由に設定できないのではと予想しています。
OS-9の専用カードの写真を見ると一つのLSIはRTC(MC146818)で、もう一つはPIA(6821)で拡張プリンタ用だと予想しているのですが、バンク切替などもあるんですかね!?
でもバンク切替できるRAMは無さそうな感じも・・・
せるじおさんの方で今後レベル3のFLEX9を見る機会がありましたら、情報をお願い致します^^
OS-9カードの写真あるんですね!RAMが載ってないようでしたらバンク切換してなさそうですね・・・失礼しました。しかし外部プリンタ用のコネクタがあるんでしょうか?不思議なカードですね。
ちょうど AppleII の 6809カード(THE MILL)上で動作する OS-9L1 の記事があったので見てみましたが、このカードも RAM は積んでおらず、本体側の RAM を使うようでした。
また L3 の OSについて何か発見がありましたらまたレポートしたいと思います^^
せるじおさんから貸し出し頂いた資料の写しで確認致しましたので同じ写真かと思います^^;;;
基板左側はアンフェノールの36Pっぽいコネクタが見えますので40PのLSIがPIAだと予想致しました。
基板右側にリボンケーブルのコネクタが見えるので、もしかすると2枚セットの基板でもう一枚にRAMがあるのかもしれません。
基板の写真を見ているだけで想像が広がってきてワクワクしますね^^
初代のL3ではRAMはMAX40KBでしたから,このエリア内でFLEXを動かしていたのではないでしょうか?
なお,私の初代L3は自前で改造してフルRAM化してあります.もっとも後2KBはROMが優先されるようになっていますので実際には62KB-RAMですが.この状態でROMの部分をDISK-BASICの後に書き加えてBOOTルーチンを改造することで62KB-RAMの状態でBOOT時にRAM上にROMの内容を上書きする形でBASICをRAM化して動かしていました.
ちなみに当時はレジスタへの書き込みで切り替えるような工作ができなかったのでフロントパネルにトグルスイッチを付けてスイッチで切り替えるようにしていました…
その後、情報を頂いてレベル3用のFLEX9はOS起動後にソフトをリロケートしてレベル3のメモリマップ変換するソフトが添付されていたそうです。
それでFLEX9からもVRAMエリアを使わないように工夫をしないとダメだと思いますのでOSにも何らかの工夫があったと思われます。
これでは私の手に負えないのでマーク5の拡張RAMを使ってチャレンジしようと思います。
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領域に配置しないでね」という制限付きなら
まぁ実現可能ではないでしょうか?
トランジェントコマンドについてはご想像の通りVRAMのエリアを避ければOKのようで、レベル3用FLEX9にはアセンブラやエディタ等のソフトをリロケートするソフトが付属していたという情報を頂きました^^
それでもVRAMエリアにデータがロードされてしまうと即座に画面が乱れると思いますのでOS側にも何かの細工が必要そうですね。
VRAM以上に始末が悪いのが割込みベクタでFMの割込みベクタは$FFF2~のエリアが書換できるようなのですがレベル3はワークエリアに飛んできておりここが変更できないので、これは難儀です・・・
私にはマーク5の拡張RAMを使ったALLRAM構成でなければ解決できそうにないです^^;;;